gpt4 book ai didi

mongodb - 根据 MongoDB 中的条件获取紧接的下一个和上一个文档

转载 作者:行者123 更新时间:2023-12-02 01:54:35 25 4
gpt4 key购买 nike

背景

我有以下收藏:

article {
title: String,
slug: String,
published_at: Date,
...
}

MongoDB 版本:4.4.10

问题

给定一篇文章,我想根据该文章的 published_at 字段获取紧接的下一篇和上一篇文章。

假设我有一篇 published_at100 的文章。而且有很多文章的published_at小于100,还有很多文章的published_at超过100。我希望管道/查询仅获取 published_at 值为 99101 或最接近的文章。

尝试

这是我的聚合管道:

const article = await db.article.findOne({ ... });

const nextAndPrev = db.article.aggregate([
{
$match: {
$or: [
{
published_at: { $lt: article.published_at },
published_at: { $gt: article.published_at },
},
],
},
},
{
$project: { slug: 1, title: 1 },
},
{
$limit: 2,
},
]);

它给出了错误的结果(在提供的文章之后的两篇文章),这是预期的,因为我知道它是不正确的。

可能的解决方案

  • 我可以使用两个单独的 findOne 查询轻松做到这一点,如下所示:

    const next = await db.article.findOne({ published_at: { $gt: article.published_at } });
    const prev = await db.article.findOne({ published_at: { $lt: article.published_at } });

    但我很想知道有什么可用的方法可以在一次访问数据库的过程中完成它。

  • 如果我对所有文章进行排序,将其偏移到时间戳,并提取上一个和下一个条目,这可能会起作用。我不知道语法。

最佳答案

从 MongoDB v5.0 开始,

你可以使用$setWindowFields根据特定的排序/排名获取即时的上一个/下一个文档。

您可以获得_id当前和下一个文档通过操作 documents: [<prev offset>, <next offset>] field 。同样,对于 OP 的场景,一次获取上一个、当前和下一个文档将是 [-1, 1]。执行 $lookup通过_id取回文件存储在 nearIds数组。

{
"$setWindowFields": {
"partitionBy": null,
"sortBy": {
"published_at": 1
},
"output": {
nearIds: {
$addToSet: "$_id",
window: {
documents: [
-1,
1
]
}
}
}
}
}

这是 Mongo playground供大家引用。

关于mongodb - 根据 MongoDB 中的条件获取紧接的下一个和上一个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69778303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com