1.假设有如下记录:
{ "_id" : ObjectId("51d7b0d436332e1a5f7299d6"), "name" : { "first" : Barack", "last" : "Obama" } }
要查出first为Barack,last为Obama的这条记录
通过点表示法,精确表示内嵌文档的键
db.profile.find({ "name.first" : "Barack" , "name.last" : "Obama"});
2.更复杂的情况,值为数组时,用$elemMatch操作符,例如:
{
"content" : ".....",
"comment" : [
{
"author" : "zhangsan",
"score" : 3,
"comment" : "shafa!"
},
{
"author" : "lisi",
"score" : 5,
"comment" : "lzsb!"
}
]
}
要查询author为zhangsan,score为3的记录,
如果用{"comment.author":"zhangsan", "comment.score":{"$gte":4}}也会打印出这条,这不是我们想要的,可以理解为分别取author,score的值,并不是同一个人的值,才造成这种结果
用$elemMatch去固定到一个元素的值,
执行:db.blogs.find({"comment":{"$elemMatch":{"author":"zhangsan","score":{"$gt":4}}}}),没有返回结果,
执行db.blogs.find({"comment":{"$elemMatch":{"author":"zhangsan","score":{"$gt":2}}}}),显示一条结果。
3.键值为null值查询操作
{sex:{$in:[null],$exists:true}},查询存在sex字段,并且为[null]值的记录
{sex:null},查询sex字段为空的记录,包括不存在sex字段的记录
4. $all,匹配那些指定键的键值中包含数组,而且该数组包含条件指定数组的所有元素的文档,数组中元素顺序不影响查询结果。
语法:{ field: { $all: [ <value> , <value1> ... ] }
记录:{"name":"t2","amount":50,"tags":[ "appliances", "school", "book" ]}
查询第二个元素为school的记录
db.inventory.find({"tags.1":"school"})
5. $size ,用其查询指定长度的数组。
语法:{field: {$size: value} }
{tags: {$size: 3} },查询tags字段包含3个元素的记录
6.$or,$in,$nor,$nin
{"name":{"$in":["zhangsan","Mike"]}},查询名称为zhangsan,或Mike的记录
{"$or":{"name":"zhangsan"},{"age":12}}
7.正则表达式,模糊查询
{"name":/Mike?/i},返回名称为Mike或Mike1的记录
往数组中加入元素
{"$push":{"ziliao":"weight"}}
$slice,取数组的前几个元素
8,删除字段,$unset,用于update操作,
9.查询指定类型的字段,$type
{"date":{"$type":18}} 查询date字段为Int64的记录
{"date":{"$type":9}} 查询date字段为Date的记录
附:bson和id对照表