在mongodb中进行筛选时获取数组索引
我将进行一个查询,以获取子数组索引为偶数的数据 输入值:在mongodb中进行筛选时获取数组索引,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我将进行一个查询,以获取子数组索引为偶数的数据 输入值: { "_id" : ObjectId("5b3b206c4a25da19d05f41a2"), "numbers" : [ { "name" : "Foobar", "lines" : [ { "number" : 6, },
{
"_id" : ObjectId("5b3b206c4a25da19d05f41a2"),
"numbers" : [
{
"name" : "Foobar",
"lines" : [
{
"number" : 6,
},
{
"number" : 11,
},
{
"number" : 15,
},
{
"number" : 8,
}
]
}
]
}
期望输出:
{
"_id" : ObjectId("5b3b206c4a25da19d05f41a2"),
"numbers" : [
{
"name" : "Foobar",
"lines" : [
{
"index" : 0,
"number" : 6,
},
{
"index" : 3,
"number" : 8,
}
]
}
]
}
最重要的是获取“行”项的索引。您需要使用来迭代第一个数组,然后使用嵌套数组
db.collection.aggregate([
{ "$project": {
"numbers": {
"$map": {
"input": "$numbers",
"as": "nn",
"in": {
"name": "$$nn.name",
"lines": {
"$filter": {
"input": {
"$map": {
"input": "$$nn.lines",
"as": "ll",
"in": {
"number": "$$ll.number",
"index": { "$indexOfArray": ["$$nn.lines.number", "$$ll.number"] }
}
}
},
"as": "ll",
"cond": { "$eq": [{ "$mod": ["$$ll.number", 2] }, 0] }
}
}
}
}
}
}}
])
即使你需要更多的聚合技巧
db.collection.aggregate([
{ "$project": {
"numbers": {
"$map": {
"input": {
"$map": {
"input": "$numbers",
"as": "nn",
"in": {
"name": "$$nn.name",
"lines": {
"$filter": {
"input": { "$zip": { "inputs": ["$$nn.lines", { "$range": [0, { "$size": "$$nn.lines" }] }] }},
"as": "ll",
"cond": {
"$let": {
"vars": { "num": { "$arrayElemAt": ["$$ll", 0] }},
"in": { "$eq": [{ "$mod": ["$$num.number", 2] }, 0] }
}
}
}
}
}
}
},
"as": "nn",
"in": {
"name": "$$nn.name",
"lines": {
"$map": {
"input": "$$nn.lines",
"as": "kk",
"in": {
"number": { "$arrayElemAt": ["$$kk.number", 0] },
"index": { "$arrayElemAt": ["$$kk", 1] }
}
}
}
}
}
}
}}
])
最后两者都会给你相似的结果
非常感谢。但我可以添加带有“索引”的字段吗?我说过最重要的是获取子数组字段中项目的索引以获得结果。是的,IndexOfArray可以做到这一点。只需几分钟更新我的回答。我尝试使用。但有一个小错误。MongoError:无效运算符“$IndexOfArray”您能告诉我原因吗?谢谢。:)Mongodb版本?
[
{
"_id": ObjectId("5b3b206c4a25da19d05f41a2"),
"numbers": [
{
"name": "Foobar",
"lines": [
{
"index": 0,
"number": 6
},
{
"index": 3,
"number": 8
}
]
}
]
}
]