mongodb 操作命令

参考:https://www.cnblogs.com/cswuyg/p/4595799.html https://www.cnblogs.com/zhuminghui/p/8330429.html

https://blog.csdn.net/qq_48496502/article/details/124175432

MongoDB中,不用创建集合, 因为没有固定的结构, 直接使用db.集合名称.命令 来操作就可以了, 如果非要显示创建的话

使用: db.createCollection(“集合名称”)

注意:

1:没有显示指定 id 时, 会自动添加 id

2:MongoDB 每个文档大小不能超过16MB

3:可以使用 Object.bsonsize(“文档名”) 来看大小

1、shell登陆和显示

登陆:mongo --port 27017

显示DB:show dbs

进入某DB:use test_cswuyg

显示集合:show tables

2、文档添加

语法:

db.集合名.insertOne( 文档 ) : 往集合中插入一个文档

db.集合名.insertMany(文档):往集合中插入多个文档

db.集合名.insert( 文档 ) : 往集合中插入一个文档或者多个
db.users.insert({id: 1, name: "dafei", age: 18})

2、简单查找

查找文档:db.test_mac_id.find({'a':  'b'})

删除文档:db.test_mac_id.remove({'a': 'b'})

查找找到某一天的数据:

db.a.find({'D' :  ISODate('2014-04-21T00:00:00Z')}) 或者 db.a.find({'D' :  ISODate('2014-04-21')})

删除某一天的数据:

db.region_mac_id_result.remove({"D" :  ISODate('2014-04-17')})

小于2014.6.5的数据:

db.xxx.find({E: {$lt :ISODate('2014-06-05')}})

大于等于2014.6.1的数据:

db.xxx.find({E: {$gte: ISODate("2014-05-29")}}).count()

两个条件:

db.xxx.find({E:{$gte: ISODate("2014-05-29"), $lte: ISODate("2014-06-04")}}).count()

json中的嵌套对象查询,采用“点”的方式:

mongos> db.wyg.find({"a.b": {$exists: true}})

{ "_id" : "c", "a" : { "b" : 10 } }

某个字段存在,且小于1000有多少:

db.stat.find({_:  ISODate("2014-06-17"), "123": {$exists: 1, $lte: 1000}}, {"123": 1}).count()

批量修改字段

db.oa_verify.find({}).forEach(
function(item){
db.oa_verify.update({"_id":item._id},{"$set":{"updatetime":item.addtime}},false,true)
});

 修改多条

db.collect.update({"zhaoshangrexian.电话类型":"1","pinpaimingcheng":"何老大"},{$set:{"pinpaimingcheng":"何老大"}},{multi:true})

聚合使用
db.collect.aggregate([ // aggregate方法接收的是一个数组
{
$group: {
_id: '$time',
num: {$sum: 1}
}
}
])

管道操作符
常用管道 含义
$group 将collection中的document分组,可用于统计结果
$match 过滤数据,只输出符合结果的文档
$project 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
$sort 将结果进行排序后输出
$limit 限制管道输出的结果个数
$skip 跳过制定数量的结果,并且返回剩下的结果
$unwind 将数组类型的字段进行拆分


表达式操作符
常用表达式 含义
$sum 计算总和,{$sum: 1}表示返回总和×1的值(即总和的数量),使用{$sum: '$制定字段'}也能直接获取制定字段的值的总和
$avg 平均值
$min min
$max max
$push 将结果文档中插入值到一个数组中
$first 根据文档的排序获取第一个文档数据
$last 同理,获取最后一个数据

按照time分组同时name存在数组中

db.collect.aggregate([
{
   $group: {
       _id: '$time',
       gameName: {$push: '$name'}
   }
}
]) 

 

结果:

{
    "_id" : 0.0,
    "gameName" : [ 
        "ghost Recon", 
        "farCry"
    ]
}

 

$match 和 $group

db.collect.aggregate([
{
    $match: {
    time: {$gte: 20}
    }
},
{
    $group: {
    _id: null, // _id: null表示全选
    totalNum: {$sum: 1}
    }
}
])

 

$project 投影

db.collect.aggregate([
    {
        $project: {
            _id: 0,  //不显示_id字段
        }
    }
])

 

和我们直接写db.Ubisoft.find({},{'_id': 0})写法一样

 

db.collect.aggregate([
    {
        $match: {
            time: {$gte: 20}
        }
    },
    {
        $project: {
            _id: 0, // _id不显示
            name: 1 // name是要显示的
        }
    },
    {
        $group: {
            _id: null,
            name: {$push: '$name'}
        }
    }
])

 

$sort

db.Ubisoft.aggregate([
    {
        $sort: {
            time: -1
        }
    }
])

 


$limit $skip
和limit()以及skip()的写法也是一样的。

 

db.collect.find().skip(1).limit(2)

db.collect.aggregate([
    {
        $skip: 1
    },
    {
        $limit: 2
    }
])

 

$unwind

例子:

{
    "_id" : ObjectId("5b0e242ed85f6f9cc56da7cc"),
    "name" : "gameList",
    "list" : [ 
        "dota2", 
        "csgo", 
        "ow"
    ]
}
db.collect.aggregate([
    {
        $unwind: '$list' // 指定list字段
    }
])

 

可以看到,list为[],null,以及无指定字段的数据都丢失了,

为了不丢失数据,我们可以写成:

db.collect.aggregate([
    {
        $unwind: {
            path: '$list', // path是指定字段
            preserveNullAndEmptyArrays: true //该属性为true即保留
        }
    }
])

 

$unset
删除集合中字段

db.collect.update({'name':'ls'},{$unset:{'score':''}})

 子集操作


新增数据到子集中
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b')},{$addToSet:{child:{childId:3,type:3,name:'测试3'}}});
多条数据 $each
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b')},{$addToSet:{child:{$each:[{childId:3,type:3,name:'测试3'},{childId:4,type:4,name:'测试4'}]}}});

子集内容修改
//这里注意子集字段在查询条件直接是 父子段.子集字段 的形式,修改关键字是 父子段.$.子集字段
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b'),child.type:1},{$set:{child.$.name:"测试01"}})


子集删除

//删除数据{childId:1,type:1,name:'测试1'}
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b')},{$pull:{child:{childId:1,type:1,name:'测试1'}}});

关联查询

参考:https://blog.csdn.net/yanyuan_1118/article/details/109526876

db.getCollection("note").aggregate(
[{
"$project":
{
"id":
{
"$convert": {
"input": "$_id",
"to": "string"
}
},
"noteCode": 1
}
}, {
"$lookup":
{
"from": "noteImage",
"localField": "id",
"foreignField": "noteId",
"as": "image_docs"
}
}]
);

 

db.getCollection("noteImage").aggregate(
[{
"$project":
{
"nid":
{
"$convert": {
"input": "$noteId",
"to": "objectId"
}
},
"imgId": 1
}
}, {
"$lookup":
{
"from": "note",
"localField": "nid",
"foreignField": "_id",
"as": "noteDocs"
}
}]
);

posted @ 2022-09-27 11:40  飞鹰之歌  阅读(57)  评论(0编辑  收藏  举报