Arrays 如何将现有子文档推送到MongoDB中的嵌入式数组中?

Arrays 如何将现有子文档推送到MongoDB中的嵌入式数组中?,arrays,mongodb,Arrays,Mongodb,我试图确定以下用例在MongoDB 3.4中是否可行:我有一个包含文档的集合,其模式与此类似: { "_id": ObjectId("..."), "data": { "fname": "John", "lname": "Doe" }, "history": [] } 数据字段用于保存实体的当前状态,历史数组用于保存实体的最新版本(考虑最大文档大小和查询目的) 当从应用程序逻辑发出更新操作时,我希望$push将数据字段放入历史数组

我试图确定以下用例在MongoDB 3.4中是否可行:我有一个包含文档的集合,其模式与此类似:

{
    "_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