zoukankan      html  css  js  c++  java
  • Mongo 常用操作

    1、查询

      基本形式】db.col.find().pretty()pretty() 方法以格式化的方式来显示所有文档。

      【获取记录条数db.users.find().count(); 

    【读取指定数量的数据 limit(number)】db.COLLECTION_NAME.find().limit(NUMBER)
    【排序 1-asc;-1-desc】db.COLLECTION_NAME.find().sort({KEY:1})
    db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
    【count(*) 聚合框架】:MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
    eg:通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和
    select by_user as _id, count(*) as num_tutorial from mycol group by by_user
    (1)分组求和:db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
    结果如下:
    {
       "result" : [
          {
             "_id" : "runoob.com",
             "num_tutorial" : 2
          },
          {
             "_id" : "Neo4j",
             "num_tutorial" : 1
          }
       ],
       "ok" : 1
    }

    (2)分组求平均

    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])【根据 by_user 字段分组,每组计算 likes 的平均值】

    (3)计算每组的极值:

    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])

    【跳过指定数量的数据】db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER) 

    >db.col.find({},{"title":1,_id:0}).limit(1).skip(1)【总共读取1条,但跳过1条,所以读的是第 2 条数据】
    (4)聚合管道
    db.articles.aggregate( [
                            { $match : { score : { $gt : 70, $lte : 90 } } },
                            { $group: { _id: null, count: { $sum: 1 } } }
                           ] );

    $match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。

    db.article.aggregate(
        { $project : {
            _id : 0 ,【不包含这个默认的字段】
            title : 1 ,
            author : 1
        }});

    这样的话结果中就只还有tilte和author 两个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以:_id:0

    条件查询】
    • (>) 大于 - $gt     【 greater than】
    • (<) 小于 - $lt       【lower than】
    • (>=) 大于等于 - $gte  【 greater than  equal】
    • (<= ) 小于等于 - $lte        【lower than equal】

     (3)多条件查询 And

    db.col.find({key1:value1, key2:value2}).pretty()
    db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
    以上实例中类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'

    (4)Or 查询
    db.tableName.find(
       {
          $or: [
             {key1: value1}, {key2:value2}
          ]
       }
    ).pretty()
    
    
    >db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一个 Nosql 数据库",
            "by" : "菜鸟教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

     (5)AND 和 OR 联合使用

    类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')' 

    >db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一个 Nosql 数据库",
            "by" : "菜鸟教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

     (6) 根据 mongo 中属性的类型查询数据

    如果想获取 "col" 集合中 title 为 String 的数据

    db.col.find({"title" : {$type : 2}})

    Double:1;String:2;Object:3;Array:4;Binary data:5;Undefined:6;Object id:7;Boolean:8;Date:9;Null:10;Regular Expression:11;JavaScript:13;Symbol:14;JavaScript(with scope):15; 32-bit integer:16;Timestamp:17;64-bit integer:18;Min kye:255(query with -1);Max key:127; 

    2、insert()方法 

    >db.col.insert({
        title: 'MongoDB 教程', 
        description: 'MongoDB 是一个 Nosql 数据库',
        by: '菜鸟教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    })

     3、update() 方法 

    db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>,
         multi: <boolean>,
         writeConcern: <document>
       }
    )

     参数说明:

    • query : update的查询条件,类似sql update查询内where后面的。
    • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern :可选,抛出异常的级别。
    • >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息

       全部更新:db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

    • db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

      4、清空集合 

    • db.col.remove({})

       5、索引

    • 创建索引:db.COLLECTION_NAME.ensureIndex({KEY:1})  【1:asc; -1:desc】
    • 复合索引db.col.ensureIndex({"title":1,"description":-1})
    • 在后台创建索引:db.collName.ensureIndex({open: 1, close: 1}, {background: true})
  • 相关阅读:
    树的子结构(剑指offer_26)
    合并两个排序的链表(剑指offer_25)
    反转链表(剑指offer_24)多看多思多想
    链表中环的入口结点(剑指offer_23)
    链表中倒数第k个节点
    调整数组顺序使奇数位于偶数前面(剑指offer_21)
    表示数值的字符串(剑指offer_20)
    1676. 跳石头
    1670. 回合制游戏
    1667. 区间统计(回顾)
  • 原文地址:https://www.cnblogs.com/quietwalk/p/9120017.html
Copyright © 2011-2022 走看看