返回查询查询中的整个文档 - Mongodb

时间:2017-01-02 07:55:51

标签: node.js mongodb

假设我有文件为;

{
  id: 1,
  name: "alex",
  adress: [
    {type: "home" , street: "flower"},
    {type: "business" , street: "falls"},
    {type: "xxx" , street: "xxx"},
  ]
}

我希望得到home地址。为了得到这个,我写了以下查询;

db.collection.find({id: 1, "adress.type" : "home"})

由于此查询,它返回了我;

{
  id: 1,
  name: "alex",
  adress: [
    {type: "home" , street: "flower"},
    {type: "business" , street: "falls"},
    {type: "xxx" , street: "xxx"},
  ]
}

但我想要的只是获得home adress;

{
  id: 1,
  name: "alex",
  adress: [
    {type: "home" , street: "flower"}
  ]
}

如何缩小此查询的结果范围?我应该如何编写查询才能获得home adress

尝试@SagarReddy和@suzo的答案后编辑

。如果我有一场比赛,他们的答案是正确的。

答案不适用于以下情况;

{
  id: 1,
  name: "alex",
  adress: [
    {type: "home" , street: "flower"},
    {type: "business" , street: "falls"},
    {type: "home" , street: "instinct"},
    {type: "xxx" , street: "xxx"},
  ]
}

db.collection.find({id: 1, "adress.type" : "home"}, {"adress.$":1})返回;

{ 
    id: 1
    "adress" : [
        {
            "type" : "home", 
            "street" : "flower"
        }
    ]
}

这不是真的。它只有一场比赛。

您的期望是什么;

{ 
"id" : 1, 
"name" : "alex", 
"adress" : [
    {
        "type" : "home", 
        "street" : "flower"
    }, 
    {
        "type" : "home", 
        "street" : "instinct"
    }
]

}

所以问题仍然有效。如何才能获得mongodb中匹配的部分查找查询?

2 个答案:

答案 0 :(得分:1)

您可以使用位置$运算符来限制查询结果中数组的内容,使其仅包含与查询文档匹配的第一个元素,如下所示:

db.collection.find({id: 1, "adress.type" : "home"}, {"name":1, "address.$":1});

但是当在所选文档中只需要一个特定的数组元素时,在find()方法或findOne()方法的投影文档中使用 $

要获取数组中所有匹配的元素而不是第一个元素,您可以使用$filter聚合器来执行以下操作:

  

这是Mongodb 3.2版中的新功能。

[{
 "$match": {
   "address.type": "home"
 }
},
{
"$project": {
  "address": {
    "$filter": {
      "input": "$address",
      "as": "address",
      "cond": {
        "$eq": ["$$address.type", "home"]
      }
    }
  }
}
}]

答案 1 :(得分:0)

尝试聚合匹配并投影地址。

 db.collection.aggregate([
                  { $match : {id: 1, "adress.type" : "home"}},
                  {$project : { adress: 1} } 
                   ]}.exec(function (err, doc) {
        if (err) callback(err);
        else callback(null, doc);
    });