MongoDB查找精确数组匹配,但顺序无关紧要

Har*_*ara 12 arrays mongodb mongodb-query

我正在查询找到精确的数组匹配并成功检索它,但是当我试图找出具有不同顺序的值的确切数组时,它就会失败.

Example

db.coll.insert({"user":"harsh","hobbies":["1","2","3"]})
db.coll.insert({"user":"kaushik","hobbies":["1","2"]})
db.coll.find({"hobbies":["1","2"]})
Run Code Online (Sandbox Code Playgroud)

第二个文件成功检索

db.coll.find({"hobbies":["2","1"]})
Run Code Online (Sandbox Code Playgroud)

什么也没显示

请帮忙

kas*_*ban 31

目前接受的答案不能保证完全匹配您的阵列上,只是大小相同,并且该阵列股份至少一个与查询数组项.

例如,查询

db.coll.find({ "hobbies": { "$size" : 2, "$in": [ "2", "1", "5", "hamburger" ] }  });
Run Code Online (Sandbox Code Playgroud)

在这种情况下仍然会返回用户kaushik.

什么,你需要一个精确匹配做的是结合$size使用$all,就像这样:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] }  });
Run Code Online (Sandbox Code Playgroud)

但要注意,这可能是一项非常昂贵的操作,具体取决于您的数据量和结构.由于MongoDB保持插入数组的顺序稳定,因此在插入数据库时​​确保数组处于排序顺序可能会更好,因此在查询时可能依赖静态顺序.


Vik*_*mar 11

为了匹配数组字段,Mongo提供的$eq操作符可以在数组上操作,也可以像值一样操作.

db.collection.find({ "hobbies": {$eq: [ "singing", "Music" ] }});
Run Code Online (Sandbox Code Playgroud)

还要$eq检查指定元素的顺序.

如果您使用以下查询:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] }  });
Run Code Online (Sandbox Code Playgroud)

然后不会返回完全匹配.假设您查询:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "2" ] }  });
Run Code Online (Sandbox Code Playgroud)

此查询将返回具有元素2且大小为2的所有文档(例如,它还将返回具有hobies的文档:[2,1]).