1.查select
(1).通过$all 进行匹配查询
db.food.find({fruit:{$all:['apple','banana']}})
以下方式将查不到数据(不使用$all)
db.food.find({fruit:['apple','banana']})
db.food.find({fruit:['banana','apple','peach']})
查询数组中特定位置的元素,需要使用key.index查找
db.food.find({'fruit.2':'peach'})
(2).通过$size 查询数组的长度
db.food.find({'fruit':{'$size':2}})
(3).数组和范围查询的相互作用
db.test6.find({x:{$gt:10,$lt:20}})
查询出来,查询数组中带有小于10的数据,不符合要求
db.test6.find({x:{$gt:10,$lt:20}}.min({x:10}).max({x:20})) #目前是错误,首先要在x字段上创建索引
(4).limit、skip和sort
只返回3条记录
跳过前3个记录
按照sn进行倒排序
db.stu.find().sort({sn:-1})
这3个方法可以组合使用,每页返回50条记录,跳过前50条记录进行倒排序
db.stu.find().limit(50).skip(50).sort({sn:-1})
用skip略过少量的文档还是不错的,但是要是数量非常多的话,skip就会变的很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据
(5).随即获取文档中的数据
db.stu.find({sn:{$lt:Math.random()*10}})
(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});
在举一个栗子(对相应字段的更新,在查询条件上也要带上,否则报错)
db.attendTpl.update({"category": "hljld",'components.font':'3'},{$set:{'components.$.font':'3.18'}},{multi:true});
2.聚合查询
(1).count
(2).distinct
distinct命令必须指定集合名称,如test,以及需要区分的字段,如:age
db.runCommand({"distinct":"test", "key":"age"})
(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;
}
} } )
统计每个分组内文档的数量
db.test5.group( {
key: { day: true},
initial: {count: 0},
reduce: function(obj,prev){ prev.count++;},
} )
最后一个是通过完成器修改reduce结果的例子
db.test5.group( {
key: { day: true},
initial: {count: 0},
reduce: function(obj,prev){ prev.count++;},
finalize: function(out){ out.scaledCount = out.count * 10 } --在结果文档中新增一个键。
} )
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>
}
)
表中的数据如下:
此时要在所有的行上增加name字段,操作如下:
db.test1.update({},{$set:{name:'zhangsan'}},true,true);
方法2:
db.test1.updateMany({},{$set:{name:'zhangsan'}});
6.修改嵌套数组中的值
脚本如下:
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/