mongodb增删改查 及批量操作(三)

时间:2022-11-15 15:15:53

1.查select

(1).通过$all 进行匹配查询
db.food.find({fruit:{$all:['apple','banana']}})

mongodb增删改查 及批量操作(三)

以下方式将查不到数据(不使用$all)

db.food.find({fruit:['apple','banana']})
db.food.find({fruit:['banana','apple','peach']})

查询数组中特定位置的元素,需要使用key.index查找

db.food.find({'fruit.2':'peach'})

mongodb增删改查 及批量操作(三)

(2).通过$size 查询数组的长度
db.food.find({'fruit':{'$size':2}})

mongodb增删改查 及批量操作(三)

(3).数组和范围查询的相互作用
db.test6.find({x:{$gt:10,$lt:20}})

mongodb增删改查 及批量操作(三)

查询出来,查询数组中带有小于10的数据,不符合要求

db.test6.find({x:{$gt:10,$lt:20}}.min({x:10}).max({x:20}))   #目前是错误,首先要在x字段上创建索引
(4).limit、skip和sort

只返回3条记录

db.stu.find().limit(3)

跳过前3个记录

db.stu.find().skip(3)

按照sn进行倒排序

db.stu.find().sort({sn:-1})

mongodb增删改查 及批量操作(三)

这3个方法可以组合使用,每页返回50条记录,跳过前50条记录进行倒排序

db.stu.find().limit(50).skip(50).sort({sn:-1})

mongodb增删改查 及批量操作(三)

用skip略过少量的文档还是不错的,但是要是数量非常多的话,skip就会变的很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据

(5).随即获取文档中的数据
db.stu.find({sn:{$lt:Math.random()*10}})

mongodb增删改查 及批量操作(三)

(6).正则表达式匹配条件查询

匹配单个条件

db.mongodb_PatInhosOrder.find({orderText:/红细胞/})

匹配多个条件

db.mongodb_PatInhosOrder.find({orderText:/(白细胞|红细胞)/})

也可以采用or的方式进行匹配

db.mongodb_PatInhosOrder.find({$or:[{orderText:/白细胞/},{orderText:/红细胞/}]})
(7).修改多行数据(多层嵌套,需要连续执行多次才可以全部更新完,此处有疑问,按理执行一次即可)

注:此功能已经在3.4中不支持了

db.docTpl.update({'components.components.canvas_content.comp':'./package/default/Label/index'},{$set:{'components.components.canvas_content.$.comp':'./package/default/Text/index'}},{multi:true});

mongodb增删改查 及批量操作(三)

在举一个栗子(对相应字段的更新,在查询条件上也要带上,否则报错)

 db.attendTpl.update({"category": "hljld",'components.font':'3'},{$set:{'components.$.font':'3.18'}},{multi:true}); 

2.聚合查询

(1).count

mongodb增删改查 及批量操作(三)

(2).distinct

distinct命令必须指定集合名称,如test,以及需要区分的字段,如:age

mongodb增删改查 及批量操作(三)

db.runCommand({"distinct":"test", "key":"age"})

mongodb增删改查 及批量操作(三)

(3).group

group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档

准备测试数据:

db.test5.remove({})
db.test5.insert({"day" : "2012-08-20", "time" : "2012-08-20 03:20:40", "price" : 4.23})
db.test5.insert({"day" : "2012-08-21", "time" : "2012-08-21 11:28:00", "price" : 4.27})
db.test5.insert({"day" : "2012-08-20", "time" : "2012-08-20 05:00:00", "price" : 4.10})
db.test5.insert({"day" : "2012-08-22", "time" : "2012-08-22 05:26:00", "price" : 4.30})
db.test5.insert({"day" : "2012-08-21", "time" : "2012-08-21 08:34:00", "price" : 4.01})

这里将用day作为group的分组键,然后取出time键值为最新时间戳的文档,同时也取出该文档的price键值。

db.test5.group( {
"key" : {"day":true}, --如果是多个字段,可以为{"f1":true,"f2":true}
"initial" : {"time" : "0"}, --initial表示reduce函数参数prev的初始值。每个组都有一份该初始值。"reduce" : function(doc,prev) { --reduce函数接受两个参数,doc表示正在迭代的当前文档,prev表示累加器文档。
if (doc.time > prev.time) {
prev.day = doc.day
prev.price = doc.price;
prev.time = doc.time;
}
} } )

mongodb增删改查 及批量操作(三)

统计每个分组内文档的数量

   db.test5.group( {
key: { day: true},
initial: {count: 0},
reduce: function(obj,prev){ prev.count++;},
} )

mongodb增删改查 及批量操作(三)

最后一个是通过完成器修改reduce结果的例子  

   db.test5.group( {
key: { day: true},
initial: {count: 0},
reduce: function(obj,prev){ prev.count++;},
finalize: function(out){ out.scaledCount = out.count * 10 } --在结果文档中新增一个键。
} )

mongodb增删改查 及批量操作(三)

3.批量操作

db.collection.bulkWrite()方法能够执行批量插入,更新和删除操作   
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)

Parameter

Type

Description

operations

array

An array of bulkWrite()

Valid operations are:

See ​​Write Operations​​ for usage of each operation.

writeConcern

document

Optional. A document expressing the ​​write concern​​. Omit to use the default write concern.

ordered

boolean

Optional. A boolean specifying whether the ​​mongod​​ instance should perform an ordered or unordered operation execution. Defaults to true.

See ​​Execution of Operations​

(1).insertOne

功能等同于db.collection.insertOne().  

db.collection.bulkWrite( [
{ insertOne : { "document" : <document> } }
] )
(2).updateOne

功能等同于db.collection.updateOne()

db.collection.bulkWrite( [
{ updateOne :
{
"filter" : <document>,
"update" : <document>,
"upsert" : <boolean>
}
}
] )
(3).updateMany

功能等同于db.collection.updateMany() 

db.collection.bulkWrite( [
{ updateMany :
{
"filter" : <document>,
"update" : <document>,
"upsert" : <boolean>
}
}
] )

4.将其中的两个字段拼接后赋值给另外一个字段

关系型数据库的写法

update aa set remark = age+name;

mongodb中的写法

db.aa.find().forEach( function(u)
{
printjson(u.age+u.name);
db.aa.update({_id:u._id},{$set:{remark:u.age+u.name}},{multi:true}) ;
} );

5.mongodb中批量添加一列

方法1:
b.collection.update(
<query>,
<update>,
{
upsert: <boolean>, #设置为true时,当匹配的条件不存在时插入一行,默认为false
multi: <boolean>, #设置为true时,可以修改多行,默认为false只修改一行
writeConcern: <document>
}
)

表中的数据如下:

mongodb增删改查 及批量操作(三)

此时要在所有的行上增加name字段,操作如下:

db.test1.update({},{$set:{name:'zhangsan'}},true,true);

mongodb增删改查 及批量操作(三)

方法2:
db.test1.updateMany({},{$set:{name:'zhangsan'}});

mongodb增删改查 及批量操作(三)

6.修改嵌套数组中的值

mongodb增删改查 及批量操作(三)

脚本如下:

db.orderProcess.update({orderbar:"8008401450"},{$set:{"tasks.0.executeTime":ISODate("2020-04-17T19:26:19.238+08:00")}})

官网地址:​https://docs.mongodb.com/manual/reference/method/cursor.forEach/​