Mongodb 如何从mondodb中的集合中获取子文档?
我创建了一个包含子集合数据的集合。我想用一个键从子集合中筛选 这是我的文件:Mongodb 如何从mondodb中的集合中获取子文档?,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我创建了一个包含子集合数据的集合。我想用一个键从子集合中筛选 这是我的文件: { "_id" : ObjectId("5758098356e3930537af15dd"), "manpower_data" : [ { "_id" : ObjectId("5758098356e3930537af15de"), "created" : ISODate("2016-06-08T12:03:15.387Z"),
{
"_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”})代码>
它将返回所有两个子文档,但我只想获取那些具有匹配的dealerCodeFor
的manpower data
要过滤数组元素,需要执行带有$elemMatch
的查询投影
阶段。请参见下面的示例:
db.collection.find({
"manpower_data.dealerCodeFor" : "ZSAE876"
}, {
manpower_data : {
$elemMatch : {
dealerCodeFor : "ZSAE876"
}
}
})
要过滤数组元素,需要使用$elemMatch
执行查询投影
阶段。请参见下面的示例:
db.collection.find({
"manpower_data.dealerCodeFor" : "ZSAE876"
}, {
manpower_data : {
$elemMatch : {
dealerCodeFor : "ZSAE876"
}
}
})
您可以使用aggregate mongodb
的$filter
来实现这一点
请尝试以下操作:-
db.collection.aggregate([
{
"$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
"$project": {
"manpower_data": {
"$filter": {
"input": "$manpower_data",
"as": "o",
"cond": {
"$eq": ["$$o.dealerCodeFor", "ZSAE876"]
}
}
}
}
}])
通过运行上述查询,manpower\u 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" }
}
}])
您可以使用aggregate mongodb
的$filter
来实现这一点
请尝试以下操作:-
db.collection.aggregate([
{
"$match": {"manpower_data.dealerCodeFor":"ZSAE876"}
},
{
"$project": {
"manpower_data": {
"$filter": {
"input": "$manpower_data",
"as": "o",
"cond": {
"$eq": ["$$o.dealerCodeFor", "ZSAE876"]
}
}
}
}
}])
通过运行上述查询,manpower\u 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" }
}
}])
@Shrebanee我运行了上面的查询,但给了我错误uncaught异常:聚合失败:{“errmsg”:“异常:无效运算符'$filter'”,“代码”:15999,“确定”:0}
为什么在这里聚合?是一把猎枪,可以杀死一只小苍蝇:-),@profesor79我想,如果数组中有多个对象,匹配查询,投射所有这些对象都可以通过聚合完成。@AnuranjanPandey忘了提到,这只能用于mongodb 3.2.x版。您正在使用的版本是什么?@AnuranjanPandey编辑了我的答案,并使用了可以帮助您的查询。@Shrebanee我运行了上述查询,但给了我错误uncaught异常:聚合失败:{“errmsg”:“异常:无效运算符'$filter'”,“代码”:15999,“确定”:0}
为什么在这里聚合?是一把猎枪,可以杀死一只小苍蝇:-),@profesor79我想,如果数组中有多个对象,匹配查询,投射所有这些对象都可以通过聚合完成。@AnuranjanPandey忘了提到,这只能用于mongodb 3.2.x版。你使用的版本是什么?@AnuranjanPandey用一个可以帮助你的查询编辑了我的答案。它很有效。谢谢:)注意:-这将只返回数组中的第一个匹配对象。如果有多个,你不会得到所有的。这是有效的。谢谢:)注意:-这将只返回数组中的第一个匹配对象。如果有多个,你不会得到所有的。