在匹配的元素之后返回子文档数组元素

时间:2018-09-11 18:52:51

标签: mongodb mongoose aggregation-framework

我有一个基本上像这样的文档:

{
    _id: ObjectId("5b980578db509b467960ef50"),
    items: [
        {
            _id: ObjectId("5b980578db509b467960ef90"),
            date: 2010-10-10T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef91"),
            date: 2010-10-11T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef92"),
            date: 2010-10-12T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef93"),
            date: 2010-10-13T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef94"),
            date: 2010-10-14T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef95"),
            date: 2010-10-15T00:00:00.000Z
        }
     ]
}

我正在尝试构建一个查询,我可以在得到的所有Items(即ObjectId之后之后得到所有ObjectId("5b980578db509b467960ef92")

我的查询结果应如下所示:

{
    _id: ObjectId("5b980578db509b467960ef50"),
    items: [
        {
            _id: ObjectId("5b980578db509b467960ef93"),
            date: 2010-10-13T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef94"),
            date: 2010-10-14T00:00:00.000Z
        },
        {
            _id: ObjectId("5b980578db509b467960ef95"),
            date: 2010-10-15T00:00:00.000Z
        }
     ]
}

此外,我想要给定Items的相应date值之后的所有Item

我目前正在使用两种查询方法,其中基于Item获取匹配的ObjectID,然后使用date值查找所有Items。< / p>

在一个查询中是否有一种“更好”的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用$indexOfArray查找匹配元素的索引,并使用$slice获取3.4中从匹配索引到数组结尾的所有元素。本质上,获取最后一个元素直到匹配索引。

db.colname.aggregate([
  {"$project":{
    "items":{
      "$slice":[
        "$items",{
          "$multiply":[
            {"$subtract":[
              {"$size":"$items"},
              {"$add":[{"$indexOfArray":["$items._id",ObjectId("5b980578db509b467960ef92")]},1]}
            ]},
           -1
          ]
        }
      ]
    }
  }}
])