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

标签 arrays mongodb

我有这样的数据:

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

相关文章:

node.js - 为什么 Mongodb 更新有效但 mongoose 没有?

python - 沿轴组合数组

php - 计算php中关联数组中值的出现

java - 使用 Arrays.sort 对数组元素进行排序

javascript - 查询mongodb数据时nodejs出错?

java - Java和RabbitMQ-排队和多线程-或Couchbase作为作业队列

java - 数组显示错误值

java - 如何从二维数组中获取第一列的内容

mongodb - 将变量传递给 MongoDB View

MongoDB - 由于身份验证失败,无法使用 mongoexport 导出数据