MongoDB:从数组中分别获取所有$matched元素
我试图分别获取所有匹配的元素,即示例数据和查询MongoDB:从数组中分别获取所有$matched元素,mongodb,mongoose,nosql,mongodb-query,aggregation-framework,Mongodb,Mongoose,Nosql,Mongodb Query,Aggregation Framework,我试图分别获取所有匹配的元素,即示例数据和查询 // json [ { "name": "Mr Cool", "ican": [ { "subcategory": [ { "id": "5bffdba824488b182ec86f8d", "name": "Cricket" }, { "id": "5bffdba824488b182ec86f
// json
[
{
"name": "Mr Cool",
"ican": [
{
"subcategory": [
{
"id": "5bffdba824488b182ec86f8d", "name": "Cricket"
},
{
"id": "5bffdba824488b182ec86f8c", "name": "Footbal"
}
],
"category": "5bffdba824488b182ec86f88",
"name": "Sports"
}
]
}
]
// query
db.collection.aggregate([
{
"$match": {
"ican.subcategory.name": { $in: ["Cricket","Football"] }
}
},
{
"$project": { "_id": 1, "name": 1, }
}
])
我得到了综合结果,我需要个人比赛记录。我尝试了$all
和$elementMatch
但得到了相同的响应。我怎样才能得到下面的结果。我正在使用$aggregate
,因为我将使用$geoNear
管道来获取附近的用户
// current result
[
{
"_id": ObjectId("5a934e000102030405000000"),
"name": "Mr Cool"
}
]
// expected result
[
{
"_id": ObjectId("5a934e000102030405000000"),
"name": "Mr Cool",
"subcategory: "Cricket"
},
{
"_id": ObjectId("5a934e000102030405000000"),
"name": "Mr Cool",
"subcategory: "Footbal"
}
]
谢谢试试这个
您可以在不使用和的情况下使用以下聚合,以获得更好的性能
db.collection.aggregate([
{ "$match": { "ican.subcategory.name": { "$in": ["Cricket","Football"] }}},
{ "$project": {
"ican": {
"$reduce": {
"input": "$ican",
"initialValue": [],
"in": {
"$concatArrays": [
{ "$filter": {
"input": {
"$map": {
"input": "$$this.subcategory",
"as": "s",
"in": { "name": "$name", "subcategory": "$$s.name" }
}
},
"as": "fil",
"cond": { "$in": ["$$fil.subcategory", ["Football"]] }
}},
"$$value"
]
}
}
}
}},
{ "$unwind": "$ican" },
{ "$replaceRoot": { "newRoot": "$ican" }}
])
如果
ican
也会有多个元素呢?是的,它会有多个元素。谢谢你的回答,我会试试这个。干杯:)如果你想按id分组,你可以使用“\u id”:“$\u id”而不是“\u id”:Null只是想知道其他可能性,使用$project
或其他什么。谢谢你的回答和时间,这个查询也非常有效。使用$unwind
是否会降低查询的性能。是<代码>$REWIND是aggregationOh中代价高昂的阶段,好吧。似乎我必须花更多的时间阅读文档:)谢谢。您好,我发现这个查询有一个问题,它没有过滤数组中的数据,如果数组中只有足球,那么它会显示板球和足球@sanprodev是的,与$unwind
db.collection.aggregate([
{ "$match": { "ican.subcategory.name": { "$in": ["Cricket","Football"] }}},
{ "$project": {
"ican": {
"$reduce": {
"input": "$ican",
"initialValue": [],
"in": {
"$concatArrays": [
{ "$filter": {
"input": {
"$map": {
"input": "$$this.subcategory",
"as": "s",
"in": { "name": "$name", "subcategory": "$$s.name" }
}
},
"as": "fil",
"cond": { "$in": ["$$fil.subcategory", ["Football"]] }
}},
"$$value"
]
}
}
}
}},
{ "$unwind": "$ican" },
{ "$replaceRoot": { "newRoot": "$ican" }}
])