gpt4 book ai didi

javascript - 如何从带有 MongoDB 的游标中查找下一个 N 元素,没有 _id 并且在排序游标上

转载 作者:行者123 更新时间:2023-12-03 12:32:26 24 4
gpt4 key购买 nike

假设我在 MongoDB 中有三个人员文档,以随机顺序插入。

{
"firstName": "Hulda",
"lastName": "Lamb",
},
{
"firstName": "Austin",
"lastName": "Todd",
},
{
"firstName": "John",
"lastName": "Doe",
}

我的目标是在列表按字母顺序排列时获得奥斯汀之后的下一个人。所以我想得到名字 = Hulda 的人。
我们可以假设我知道 Austin 的 _id .
我的第一次尝试是依靠 _id 的事实。是增量的,但它不起作用,因为可以在数据库中按任何顺序添加人员。胡尔达的 _id字段的值小于 Austin 的值。我不能做 {_id: {$gt: <Austin's _id here>}}; 之类的事情
而且我还需要限制返回元素的数量,所以 N 是一个动态值。

这是我现在拥有的代码,但正如我所提到的,ID 技巧不起作用。
let cursor: any = this.db.collection(collectionName).find({_id: {$gt: 
cursor = cursor.sort({firstName: 1});
cursor = cursor.limit(limit);

return cursor.toArray();

一些澄清:
  • startId是对象的有效的现有_id
  • limit是一个持有正整数值的变量
  • 排序和限制按预期工作,只是选择下一个元素是错误的,所以 {_id: {$gt: startId}};弄乱了选择。
  • 最佳答案

    每个 MongoDB 的聚合框架操作的上下文都被限制在一个文档中。 SQL 中没有像窗口函数这样的机制。您唯一的方法是使用 $group获取包含所有文档的数组,然后获取 Austin的索引才能应用$slice :

    db.collection.aggregate([
    {
    $sort: { firstName: 1 }
    },
    {
    $group: {
    _id: null,
    docs: { $push: "$$ROOT" }
    }
    },
    {
    $project: {
    nextNPeople: {
    $slice: [ "$docs", { $add: [ { $indexOfArray: [ "$docs.firstName", "Austin" ] }, 1 ] }, 1 ]
    }
    }
    },
    { $unwind: "$nextNPeople" },
    {
    $replaceRoot: {
    newRoot: "$nextNPeople"
    }
    }
    ])

    Mongo Playground

    根据您的数据大小/MongoDB 性能,上述解决方案可能会或可能不会被接受 - 由您决定是否要在生产中部署此类代码,因为 $group操作可能非常繁重。

    关于javascript - 如何从带有 MongoDB 的游标中查找下一个 N 元素,没有 _id 并且在排序游标上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058521/

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