先插入幾條數據,如下:
db.man.insert([{"age":5},{"age":10},{"age":15},{"age":25},{"age":[12]},{"age":[12,13]},{"age":[18,21]},{"age":[5,25]}])
db.man.find()
{ "_id" : ObjectId("5899baa741d79c19ed14f7a4"), "age" : 5 }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a5"), "age" : 10 }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a6"), "age" : 15 }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a7"), "age" : 25 }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7ab"), "age" : [ 5, 25 ] }
(1)查詢 10 < x < 20 的記錄
db.man.find({"age":{"$gt":10 , "$lt":20}})
{ "_id" : ObjectId("5899baa741d79c19ed14f7a6"), "age" : 15 }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7ab"), "age" : [ 5, 25 ] }
總結
文檔中的標量(非數組元素)必須與查詢條件中的每一條語句相匹配。例如,如果使用{“x”:{"$gt":10, "$lt":20}進行查詢,只會匹配“X”鍵的值大于10并且小于20的文檔。但是假如某個文檔的x字段是一個數組,并且x的鍵的某一個元素與查詢的任何一條語句相匹配【存在】,那么這個文檔也會返回。
換一種寫法
db.man.find({"age":{"$gt":10,"$lt":20}}).min({"age":10}).max({"age":20})
Error: error: {
? ? ? ? ? ?"waitedMS" : NumberLong(0),
? ? ? ? ? ?"ok" : 0,
? ? ? ? ? ?"errmsg" : "error processing query: ns=demo.manTree: $and\n? ? age $lt 20.0\n? ? age $gt 10.0\nSort: {}\nProj: {}\n planner returned error: unable to find relevant index for max/min query",
? ? ? ? ? ?"code" : 2
}
意思是需要建立索引
db.man.ensureIndex({"age":1})
{
? ? ? ? ? "createdCollectionAutomatically" : false,
? ? ? ? ? "numIndexesBefore" : 1,
? ? ? ? ? "numIndexesAfter" : 2,
? ? ? ? ? "ok" : 1
}
再次執行
db.man.find({"age":{"$gt":10,"$lt":20}}).min({"age":10}).max({"age":20})
{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a6"), "age" : 15 }
{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }
db.man.find({"age":{"$elemMatch":{"$gt":10,"$lt":20}}})
{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }
{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }
總結
1. 可以使用 “$elemMatch” 要求 Mongodb 同時使用查詢條件中的兩個語句 與 一個數組元素進行比較,并且該標簽不會匹配非數組元素。
2. 使用min和max時候一定要該字段添加索引,要不添加就會報錯。
疑問:如果我只想查age為非數組的記錄?