在MongoDB集合中,我有一个带有"位置";用于排序的字段和可选的"字段;日期";字段,例如
[
{
"_id": "doc1",
"position": 1
},
{
"_id": "doc2",
"position": 2,
"date": "2021-05-20T08:00:00.000Z"
},
{
"_id": "doc3",
"position": 3
},
{
"_id": "doc4",
"position": 4,
"date": "2021-05-20T08:00:00.000Z"
}
]
我希望查询此集合以获取文档";在";按位置顺序指定的日期。算法是:
- 找到日期为"0"的第一个元素;在";指定的日期
- 返回其位置小于找到的元素的位置的所有文档;位置">
我用两个独立的查询天真地实现了这个算法。然而,我怀疑只需对数据库进行一次调用就可以完成,但我不知道如何继续。也许有聚合管道?
有人能给我一个线索吗?
编辑:以下是我目前使用的查询(大致(:
limit_element = db.getCollection('collection').find({
"date": { "$gte": ISODate("2021-05-20T08:00:00.000Z") }
}).sort({
"position": 1
}).limit(1)
position = limit_element['position']
elements = db.getCollection('collection').find({
"position": { "$lt": position }
}).sort({
"position": 1
})
您可以使用带有两个匹配子句的聚合管道。从本质上讲,这与您现在所做的事情相同,但在一个数据库访问中,速度更快。通过聚合,您可以访问上一阶段的结果,以便在下一阶段使用。如果这是值得的,你必须做出决定。我认为你天真的做法是明智的。在任何情况下,这都是一个有条件的问题,所以你必须先找到一个,然后再做另一个。区别就在于你在哪里做步骤。