假设我有文件为;
{
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
?
答案不适用于以下情况;
{
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中匹配的部分查找查询?
答案 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);
});