gpt4 book ai didi

javascript - 如何将项目存储在 MongoDb 中的排序列表中?

转载 作者:可可西里 更新时间:2023-11-01 10:47:25 25 4
gpt4 key购买 nike

我正在使用 MongoDb 构建发布轮换解决方案。

例如,客户端有 1000 种产品,并且在任何时候,这些产品中的 200 种应该可供订阅者使用。其余 (800) 应该采用轮换模式,每天发布一种产品,另一种未发布,这样 800 天后就会发生完整的轮换。

我最初的想法是简单地将 ID 引用存储在两个新集合中:

products_published
products_unpublished

然后,每天 shift() products_publishedunshift() 一个项目到 products_unpublished,同时 pop() 一个项目从 products_unpublishedpush()products_published:

enter image description here

也许是一种非常幼稚的轮换尝试。但这似乎很简单。

最后的要求是这个旋转顺序必须可以通过一些 UI 进行编辑。

问题在于 MongoDb 似乎不能保证自然顺序,也不容易在集合中的确切位置插入文档、移动它们等。

我真的不想在我的文档上维护我自己的 order 属性,因为每次旋转我都必须增加每个文档的 order

我还考虑过将所有这些数据保存在具有两个数组的单个文档中,因为文档本身中的数组确实以安全的方式保持顺序。然而,这感觉很脏,并且容易在未来出现问题。

经过大量谷歌搜索,我没有找到关于如何使用 MongoDb 维护有序集合的好答案。

我不想使用硬编码日期,因为轮换频率将来可能会变成一天两次、一天三次等。

有什么建议吗?

最佳答案

添加 2 个属性:orderpublished_date。前者供用户定义初始订单。后者供您轮换。

获取下一个的查询:

db.collection.find({}).sort({published_date: 1, order: 1}).limit(1)

推送/弹出更新:

db.collection.update({_id}, {$set:{published_date: new ISODate()}})

order 更改时,删除所有 published_date 以使新订单生效。

例子:

// initial data
db.collection.insert([
{_id:1, order:2},
{_id:2, order:1},
{_id:3, order:3}
])

// pick the first document
db.collection.find({}).sort({published_date: 1, order: 1}).limit(1)
// returns you {_id:2, order:1}

// rotating it:
db.collection.update({_id:2}, {$set:{published_date: new ISODate()}})

// pick the first document
db.collection.find({}).sort({published_date: 1, order: 1}).limit(1)
// returns you {_id:1, order:2}

// rotating it:
db.collection.update({_id:1}, {$set:{published_date: new ISODate()}})

// pick the first document
db.collection.find({}).sort({published_date: 1, order: 1}).limit(1)
// returns you {_id:3, order:3}

// rotating it:
db.collection.update({_id:1}, {$set:{published_date: new ISODate()}})

// pick the first document
db.collection.find({}).sort({published_date: 1, order: 1}).limit(1)
// returns you {_id:2, order:1, published_date: 2018-02-27T18:28:20.330Z}

etc, etc, etc until end of days at 15:30:08 on Sunday, December 4th in the year 292,277,026,596 AC

如果您不喜欢日期作为自然的自动递增值,您可以单独使用订单字段。

推送/弹出更新将是:

db.collection.update({_id}, {$inc:{order: <number of documents in rotation>}})

但它需要时不时地对 $dec 计数器进行一些内务处理,并且使单个文档的移动变得复杂。

或者,您可以考虑将 ID 保存在单个文档中,而不是集合中:

{
refs: [
product_id,
product_id,
product_id,
]
}

如果它符合单个文档的 16MB 限制。

保留数组中元素的顺序:http://www.rfc-editor.org/rfc/rfc7159.txt , 你可以使用常规 $push/$pop更新

关于javascript - 如何将项目存储在 MongoDb 中的排序列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013312/

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