我的文档结构如下
{
_id: 32131
names:
{
current : {value : 1, name: a}
prev : [{value : 2, name: b}, {value : 3, name: c} , {value : 4, name: d} ]
}
}
当我收到需要在names
字段中插入的新记录时,我想在current
字段中获取记录并将其推送到prev数组。然后我想将新记录插入current
字段。新记录将始终具有唯一的value
。
例如,如果我将新记录设为{value: 5, name : e}
,我希望上述文档如下所示
{
_id: 32131
names:
{
current : {value : 5, name: e}
prev : [{value : 2, name: b}, {value : 3, name: c} , {value : 4, name: d}, {value : 1, name: a}]
}
}
答案 0 :(得分:1)
你在这里基本上要做的并不是不合理的,但当然有一个明显的问题。问题是目前MongoDB无法引用其他字段中存在的现有值,并将它们用作更新的一部分。
所以你想要的基本JavaScript shell形式的伪代码是:
db.collection.update(
{ "_id": 32131 },
{
"$set": { "names.current": { "value": 5, "name": "e" } },
"$push": { "names.prev": {
"value": this.names.current.value,
"name": this.names.current.name
}}
}
)
但当然这不存在也不起作用。
我建议的是“将问题转过来”,基本上还将当前值存储在数组中:
{
"_id": 32131,
"names": {
"current" : { "value": 1, "name": "a" }
"revisions": [
{ "value": 2, "name": "b" },
{ "value": 3, "name": "c" },
{ "value": 4, "name": "d" },
{ "value": 1, "name": "a" }
]
}
}
因此,当阵列中已存在“当前”值时,更改数据并添加“当前”非常简单:
db.collection.update(
{ "_id": 32131 },
{
"$set": { "names.current": { "value": 5, "name": "e" } },
"$push": { "names.revisions": {
"value": 5,
"name": "e"
}}
}
)
当您在客户端或服务器上以某种形式的逻辑查询时,您始终可以“过滤”数组中的“当前”值。
但这就是我认为最好的方法,否则你需要在“写”之前“读取”数据才能知道存在的数据。这将导致并发问题。