我有一个基本上像这样的文档:
{
_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>
在一个查询中是否有一种“更好”的方法?
答案 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
]
}
]
}
}}
])