Arrays 如何将现有子文档推送到MongoDB中的嵌入式数组中?
我试图确定以下用例在MongoDB 3.4中是否可行:我有一个包含文档的集合,其模式与此类似:Arrays 如何将现有子文档推送到MongoDB中的嵌入式数组中?,arrays,mongodb,Arrays,Mongodb,我试图确定以下用例在MongoDB 3.4中是否可行:我有一个包含文档的集合,其模式与此类似: { "_id": ObjectId("..."), "data": { "fname": "John", "lname": "Doe" }, "history": [] } 数据字段用于保存实体的当前状态,历史数组用于保存实体的最新版本(考虑最大文档大小和查询目的) 当从应用程序逻辑发出更新操作时,我希望$push将数据字段放入历史数组
{
"_id": ObjectId("..."),
"data": {
"fname": "John",
"lname": "Doe"
},
"history": []
}
数据
字段用于保存实体的当前状态,历史
数组用于保存实体的最新版本(考虑最大文档大小和查询目的)
当从应用程序逻辑发出更新操作时,我希望$push
将数据
字段放入历史
数组,并将其替换为实体的新状态。我在MongoDB文档中找不到任何关于这方面的信息,我在上找到的每个问题都是关于将一个全新的对象推入数组,而不是“移动”现有字段的值。
是否可以像这样在$push
操作中引用文档字段?db.collection.update({“\u id”:“1234”},{“$set”:{“data”:{“data value”}},{“$push”:{“history”:{“history value”}})
您可以这样编写,它会自动将值推送到历史记录中,并将数据更改为当前状态。我相信您的应用程序代码应该处理好它。在以下步骤中:1)读取“数据”(数据库读取),2)填充历史记录(推送)3)添加“数据”(应用程序中的本地对象)的新状态并最终存储(再次执行数据库操作).为此使用弹簧数据case@TheNeoNoirDeveloper我理解你可能来自这里,并且大部分同意。我在这里尝试的是利用MongoDB
中的就地更新功能,所以整个操作都是原子化的。我最终做了一些与@kittu发布的内容非常相似的事情。参见他的回答如下。顺便说一句,我用的是C
。