gpt4 book ai didi

node.js - mongo $push 覆盖而不是添加到文档中的数组

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:10 25 4
gpt4 key购买 nike

我正在尝试通过 NodeJS 创建 Mongo DB 中文档更新的历史记录。文档更新仅在文档中的一个对象中,因此创建一组历史值似乎是有意义的。

但是,当我将 $push 函数与 db.collection.update() 一起使用时,它仅更新索引 0 处的数组,而不是添加到数组中。

这是我所拥有的:

{
_id: ID,
odds: {
spread: CURRENTSPREAD,
total: CURRENTTOTAL,
history: [
0: {
spread: PREVIOUSSPREAD1,
total: PREVIOUSTOTAL1,
date: DATEENTERED
}
]
}
}

这是我想要的:

{
_id: ID,
odds: {
spread: CURRENTSPREAD,
total: CURRENTTOTAL,
history: [
0: {
spread: PREVIOUSSPREAD1,
total: PREVIOUSTOTAL1,
date: DATEENTERED1
},
1: {
spread: PREVIOUSSPREAD2,
total: PREVIOUSTOTAL2,
date: DATEENTERED2
},
...,
n: {
spread: PREVIOUSSPREAD-N,
total: PREVIOUSTOTAL-N,
date: DATEENTERED-N
}
]
}
}

添加前不需要检查之前的值是否存在。

这是我的代码:

var oddsHistoryUpdate = { 
$push: {
'odds.history': {
spread: game.odds.spread,
total: game.odds.total,
date: Date.now()
}
}
}
db.collection('games').update({"_id": ID}, oddsHistoryUpdate).
.then(finish executing)

为什么只压入0索引而不是添加到数组中?我该如何解决?

最佳答案

Bigga_HD 关于 $push 运算符的答案是正确的。但是,可能有一种替代解决方案更符合 MongoDB 的底层工作方式。

MongoDB 中的单个文档有 16MB 的硬限制,如果频繁更新文档,则数组可能会变得太大而达到此限制。

或者,您可以将新文档插入到集合中,而不是将旧文档推送到数组中。新旧文档可以通过插入日期来区分。例如:

{
_id: ID,
name: <some identification>
insert_date: ISODate(...),
odds: {
spread: CURRENTSPREAD,
total: CURRENTTOTAL
}
}

然后,您可以使用以下组合来查询集合:它的 nameinsert_date,按日期降序排序,并限制为 1 以获取最新版本:

db.collection.find({name: ...}).sort({insert_date: -1}).limit(1)

或删除查找所有版本的限制:

db.collection.find({name: ...}).sort({insert_date: -1})

要支持此查询,您可以根据 nameinsert_date 按降序创建索引(请参阅 Create Indexes to Support Your Queries )

db.collection.createIndex({name: 1, insert_date: -1})

作为奖励,您可以使用 TTL indexinsert_date 字段上自动删除旧文档版本。

关于node.js - mongo $push 覆盖而不是添加到文档中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655877/

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