我有这样的数据:
{
"_id": ObjectId("4d525ab2924f0000000022ad"),
"array": [
{ id: 1, other: 23 },
{ id: 2, other: 21 },
{ id: 0, other: 235 },
{ id: 3, other: 765 }
],
"zeroes": []
}
我想从一个数组中 $pull 一个元素并将其 $push 到同一文档中的第二个数组,以产生如下所示的结果:
{
"_id": ObjectId("id"),
"array": [
{ id: 1, other: 23 },
{ id: 2, other: 21 },
{ id: 3, other: 765 }
],
"zeroes": [
{ id: 0, other: 235 }
]
}
我意识到我可以通过查找然后更新来做到这一点,即
db.foo.findOne({"_id": param._id})
.then((doc)=>{
db.foo.update(
{
"_id": param._id
},
{
"$pull": {"array": {id: 0}},
"$push": {"zeroes": {doc.array[2]} }
}
)
})
我想知道是否有一个原子函数可以用来做这件事。 类似的东西,
db.foo.update({"_id": param._id}, {"$move": [{"array": {id: 0}}, {"zeroes": 1}]}
找到这个帖子,慷慨提供了我使用的数据,但是4年了问题还是没有解决。在过去 4 年中是否制定了解决方案?
最佳答案
There is no $move
in MongoDB .也就是说,最简单的解决方案是两阶段方法:
这里的重要部分是在更新查询中包含原始数组文档,以确保一切都是幂等的。
给定以下形式的文档:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
假设您想将 { a: 1, b: 1 }
移动到另一个字段,可能称为 someOtherArrayField
,您可能想做类似的事情。
var doc = db.col.findOne({_id: "foo"});
var arrayDocToMove = doc.arrayField[0];
db.col.update({_id: "foo", arrayField: { $elemMatch: arrayDocToMove} }, { $pull: { arrayField: arrayDocToMove }, $addToSet: { someOtherArrayField: arrayDocToMove } })
我们使用 $elemMatch
的原因是为了确保我们要从数组中删除的字段 self 们第一次查询文档以来没有改变。当加上 $pull
这也不是绝对必要的,但在这些情况下我通常会过于谨慎。如果您的应用程序中没有并行性,并且您只有一个应用程序实例,那么它并不是绝对必要的。
现在当我们检查生成的文档时,我们得到:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}
关于arrays - 在同一文档 MongoDB 中将一个元素从一个数组移动到另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48104435/