我想查询一个子文档,其中结果必须指定所有字段 而没有其他 。这可能吗?如果是这样的话?
例如:
我想要一个这样的查询:
db.users.find({
"pref.no_popup": true,
"pref.font_large": false,
"pref": { "$size", 2 }});
要匹配:
{
"user": "Ed",
"pref": {
"no_popup": true,
"font_large": false
}
}
但不是这样:
{
"user": "James",
"pref": {
"no_popup": true,
"font_large": false,
"font_red": true
}
}
我意识到$size运算符是为数组设计的,那么我该如何为子文档做类似的事情?
请注意,我确实尝试不使用点符号来查询确切的字段存在,但后来我遇到了排序问题。
答案 0 :(得分:1)
这是“子文档上的完全匹配”方案。 Here,在页面中搜索引用文字。
我认为你的查询应该是:
db.users.find({
"pref" : {
"no_popup" : true,
"font_large" : false
} });
答案 1 :(得分:1)
您检查过$exists operator吗?
db.users.find({
"pref.font_red" : {"$exists":false}
});
答案 2 :(得分:1)
如果你有许多你不会匹配的属性,只有两个不会匹配,你可以尝试这样的东西来解决订单问题(升级到Andrei的答案):
db.users.find({ $or: [
"pref" : {
"no_popup" : true,
"font_large" : false
},
"pref" : {
"font_large" : false,
"no_popup" : true
} ] });
答案 3 :(得分:0)
我认为你将不得不使用mapReduce ......
不理想,但应解决问题。
mapper=function(){ for (key in this.pref){
emit(this._id, {'count':1}); \\assume your user id is called _id
}
}
reducer=function(k,v){
counter=0;
for (i=0;i<v.length;i++){
counter+=v[i].count;
}
return {'count':counter}
}
这应该会为您提供一个包含人员ID和已设置的首选项数量的集合