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

3

我有一个文件看起来基本上像这样:

{
    _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
        }
     ]
}

我试图构建一个查询,可以获取我拥有的ObjectId(即ObjectId("5b980578db509b467960ef92"))之后的所有Items

我的查询结果应该像这样:

{
    _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
        }
     ]
}

此外,我希望在给定 Item 的对应 date 值之后获取所有的 Items

目前我使用了两个查询的方法,首先根据 ObjectID 获取匹配的 Item,然后使用 date 值查找之后的所有 Items

是否有一种更好的方法可以在一个查询中完成这个过程?

1个回答

1
您可以使用$indexOfArray查找匹配元素的索引,并使用$slice获取从匹配索引到数组末尾的所有元素。简而言之,获取匹配索引后的最后元素。
db.colname.aggregate([
  {"$project":{
    "items":{
      "$slice":[
        "$items",{
          "$multiply":[
            {"$subtract":[
              {"$size":"$items"},
              {"$add":[{"$indexOfArray":["$items._id",ObjectId("5b980578db509b467960ef92")]},1]}
            ]},
           -1
          ]
        }
      ]
    }
  }}
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接