1. find简介
db.collection.find([query],[fields])
query:查询文档
fields:指定返回的键
micromsg.user集合
{ "_id" : ObjectId("530c90500fd432925cb60204"), "id" : 100, "nickname" : "路人甲01", "lover" : { "id" : 101, "nickname" : "路人甲02" } } { "_id" : ObjectId("530c90960fd432925cb60205"), "id" : 101, "nickname" : "路人甲02", "lover" : { "id" : 103, "nickname" : "路人甲03" } } { "_id" : ObjectId("530c90970fd432925cb60206"), "id" : 103, "nickname" : "路人甲03", "lover" : { "id" : 100, "nickname" : "路人甲01" } }
find示例
db.user.find({"id": 100}); db.user.find({"lover.id": 100}, {"nickname": 1, "lover": 1}); db.user.find({"lover.id": 100}, {"nickname": 1, "lover.nickname": 1});注:_id这个键总是被返回,即便没有指定,只能显式剔除。
db.user.find({"id": 100}, {"nickname": 1, "_id": 0});限制:查询文档的值必须是常量,不能引用文档中其他键的值。
2. 查询条件
2.1 关系运算符
$lt, $lte, $gt, $gte, $ne分别对应于<, <=, >, >=, <>,可以组合起来查找一个范围。
db.user.find({"id": {"$gt": 100, "$lt": 103}})2.2 $in查询,$nin查询
与SQL中的in类似,用来查询一个键的多个值。
db.user.find({"id": {"$in": [100, 101]}}); db.user.find({"id": {"$nin": [100, 101]}});2.3 逻辑或$or,逻辑非$not
db.user.find({"$or": [{"id": {"$nin": [100, 101]}}, {"lover.id": 101}]}) db.user.find({"id": {"$not": {"$ne": 100}}});3.特定于类型的查询
3.1 null
null不仅仅匹配自身,而且匹配"不存在的"。
db.user.update({"id": 100}, {"$set": {"age": null}}); db.user.update({"id": 101}, {"$set": {"age": 20}}) //包含了age键不存在的文档 db.user.find({"age": null}); //过滤age键不存在的文档 db.user.find({"age": {"$in": [null], "$exists": true}});3.2 正则表达式
匹配字符串,也可以匹配正则表达式
db.user.find({"nickname": /^路人甲/}); db.user.update({"id": 100}, {"$set": {"nickname": /^路人甲3/}}); db.user.find({"nickname": /^路人甲3/});3.3 数组
-- 包含
db.user.update({"id": 100}, {"$set": {"favorite_books": ["西游", "水浒", "三国"]}}); db.user.update({"id": 101}, {"$set": {"favorite_books": ["聊斋", "午夜凶铃", "三国"]}}); db.user.update({"id": 103}, {"$set": {"favorite_books": ["冰与火之歌", "哈利波特"]}}); //包含 db.user.find({"favorite_books": "三国"}); //包含任意一个 db.user.find({"favorite_books": {"$in": ["三国", "水浒"]}});-- 包含多个 $all,与顺序无关
db.user.find({"favorite_books": {"$all": ["三国", "西游"]}});-- 完全匹配:完整的数组精确匹配,元素个数和顺序均一致
//匹配成功 db.user.find({"favorite_books": ["西游", "水浒", "三国"]}); //匹配失败 db.user.find({"favorite_books": ["水浒", "三国"]});-- 精确匹配
db.user.find({"favorite_books.2": "三国"});-- $size
db.user.find({"favorite_books": {"$size": 2}});注:"$size"并不能与其他查询子句组合,比如$gt,但是这种查询可以通过在文档中添加一个"size"键的方式来实现。这样每次添加或者移除元素的时候同步更新"size"键,例如
//添加size键 db.user.update({"id": 100}, {"$set": {"favorite_books_size": 3}}); //更新size键 db.user.update({"id": 100}, {"$push": {"favorite_books": "红楼"}, "$inc": {"favorite_books_size": 1}});-- $slice 返回数组的一个子集合
//1个参数,表示从0开始取n个元素 db.user.find({"id": 100}, {"favorite_books": {"$slice": 2}}); //2个参数,表示从m开始取n个元素 db.user.find({"id": 100}, {"favorite_books": {"$slice": [1, 2]}}); //返回最后一个元素 db.user.find({"id": 100}, {"favorite_books": {"$slice": -1}});注:其它键为默认返回。