我无法正确获得查询的答案MongoDB-查找方法

时间:2018-11-30 15:15:13

标签: arrays node.js mongodb express mongoose

我的json:

  { 
    "user_id" : "1000" ,
    "boxes" : [
        {
            "box_id" : "12345", 
            "box_name" : "Box 3", 
            "items" : [], 
            "visible" : false 
        },
        {
            "box_id" : "2000", 
            "box_name" : "Box 1", 
            "items" : [],
            "visible" : true 
        }, 
        {
            "box_id" : "3000", 
            "box_name" : "Box 2", 
            "items" : [], 
            "visible" : true 
        }
    ], 
    "user_name" : "Jimmy", 
}

我只是想获取属于user_id:"1000",属于visible: true和属于box_id: "3000"的盒子。 我的查询是:

db.getCollection("users")
   .find({user_id:"1000", 
          $and: [{"boxes.box_id": "3000"},{"boxes.visible": true}]}, 
          {"boxes.$":1})

但是我总是得到box_id:12345一个。我什么都找不到。 谢谢您的回答。

1 个答案:

答案 0 :(得分:0)

根据the documentation for the positional $ operator,不能在多个条件下使用$。您必须使用$elemMatch来解决该限制。

  

数组字段限制

     

MongoDB在处理时需要满足以下条件   在数组上投影:

     
      
  • 投影文档中只能出现一个位置$运算符。
  •   
  • 仅一个数组字段,该字段受$投影限制   运算符,应出现在查询文档中。附加数组字段   查询文档中的内容可能会导致未定义的行为。
  •   
  • 查询   文档只能在数组字段上包含一个条件   被投影。多个条件可能会相互覆盖   内部,并导致不确定的行为。
  •   
     

在这些要求下,以下查询不正确:

db.collection.find( { <array>: <value>, <someOtherArray>: <value2> },
                    { "<array>.$": 1 } )
     

要在该数组内的文档的多个字段上指定条件,   使用$ elemMatch查询运算子。以下查询返回   成绩数组中的第一个文档的平均值大于   70分,且成绩大于90分。

db.students.find( { grades: { $elemMatch: {
                                            mean: { $gt: 70 },
                                            grade: { $gt:90 }
                                          } } },
                  { "grades.$": 1 } )
     

如果需要单独的条件,则必须使用$ elemMatch运算符   用于选择文档并在其中选择字段   文档。

所以我会尝试这样的查询:

db.users.find({ user_id:"1000", boxes: { $elemMatch: { "box_id": "3000", "visible": true } } }, {"boxes.$":1});