在MongoDB子文档中查找包含一定数量字段的结果

时间:2014-02-24 15:37:25

标签: mongodb mongodb-query

我想查询一个子文档,其中结果必须指定所有字段 而没有其他 。这可能吗?如果是这样的话?

例如:

我想要一个这样的查询:

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运算符是为数组设计的,那么我该如何为子文档做类似的事情?

请注意,我确实尝试不使用点符号来查询确切的字段存在,但后来我遇到了排序问题。

4 个答案:

答案 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和已设置的首选项数量的集合