gpt4 book ai didi

arrays - 在同一文档 MongoDB 中将一个元素从一个数组移动到另一个数组

转载 作者:可可西里 更新时间:2023-11-01 10:39:53 26 4
gpt4 key购买 nike

我有这样的数据:

{
"_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 年中是否制定了解决方案?

Move elements from $pull to another array

最佳答案

There is no $move in MongoDB .也就是说,最简单的解决方案是两阶段方法:

  1. 查询文档
  2. 使用 $pull 制作更新和 $push/$addToSet

这里的重要部分是在更新查询中包含原始数组文档,以确保一切都是幂等的。

给定以下形式的文档:

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

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