在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
          }
        ]
      }
    ]
  }
]