我创建了一个包含子集合数据的集合。我想用密钥过滤子集合。
这是我的文件:
{
"_id" : ObjectId("5758098356e3930537af15dd"),
"manpower_data" : [
{
"_id" : ObjectId("5758098356e3930537af15de"),
"created" : ISODate("2016-06-08T12:03:15.387Z"),
"designation" : "Visiting Evaluator",
"evaluatorContactNumber" : "987654321",
"evaluatorName" : "Dumy User1",
"dealerCodeFor" : "ZSAE876",
"region" : "Gurgaon"
},
{
"_id" : ObjectId("5758098356e3930537af15de"),
"created" : ISODate("2016-06-08T12:03:15.387Z"),
"designation" : "Resident Evaluator",
"evaluatorContactNumber" : "987654321",
"evaluatorName" : "Dumy User2",
"dealerCodeFor" : "ZSAE877",
"region" : "Delhi"
}
]
}
当我运行此查询时
db.mycollection.find({"manpower_data.dealerCodeFor":"ZSAE876"});
它返回了我所有的两个子文档,但我只想获得匹配manpower data
的{{1}}。
答案 0 :(得分:2)
要过滤数组元素,需要执行查询projection
阶段$elemMatch
。请参阅以下示例:
db.collection.find({
"manpower_data.dealerCodeFor" : "ZSAE876"
}, {
manpower_data : {
$elemMatch : {
dealerCodeFor : "ZSAE876"
}
}
})
答案 1 :(得分:2)
您可以使用$filter
aggregate-mongodb
来实现此目标。
请尝试以下方法: -
db.collection.aggregate([
{
"$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
"$project": {
"manpower_data": {
"$filter": {
"input": "$manpower_data",
"as": "o",
"cond": {
"$eq": ["$$o.dealerCodeFor", "ZSAE876"]
}
}
}
}
}])
通过运行上述查询,manpower_data
将仅返回符合您条件的对象。
编辑: -
对于小于2.6.x
的版本,请尝试以下查询: -
db.collection.aggregate([
{
"$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{ "$unwind": "$manpower_data" },
{
"$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
"$group": {
"$_id": "$_id",
"manpower_data": { "$push": "$manpower_data" }
}
}])