通过ID将对象以原子方式从一个数组移动到同一文档中的另一个数组

游牧民族

我有看起来像这样的数据:

{
  "_id": ObjectId("4d525ab2924f0000000022ad"),
  "arrayField": [
    { id: 1, other: 23 },
    { id: 2, other: 21 },
    { id: 0, other: 235 },
    { id: 3, other: 765 }
  ],
  "someOtherArrayField": []
}

给定嵌套对象的ID(0),我想$pull将元素从一个数组(arrayField$push移至someOtherArrayField同一文档中的另一个数组()。结果应如下所示:

{
  "_id": ObjectId("id"), 
  "arrayField": [
    { id: 1, other: 23 },
    { id: 2, other: 21 },
    { id: 3, other: 765 }
  ],
  "someOtherArrayField": [
    { id: 0, other: 235 }
  ]
}

我意识到我可以通过查找并随后进行更新来完成此操作,即

db.foo.findOne({"_id": param._id})
.then((doc)=>{
  db.foo.update(
    {
      "_id": param._id
    },
    {
      "$pull": {"arrayField": {id: 0}},
      "$push": {"someOtherArrayField": {doc.array[2]} }
    }
  )
})

但是我正在寻找一个原子操作,例如伪代码:

db.foo.update({"_id": param._id}, {"$move": [{"arrayField": {id: 0}}, {"someOtherArrayField": 1}]}

是否有一种原子方法可以执行此操作,也许使用MongoDB 4.2的功能来指定更新命令的管道看起来怎么样?

我发现这篇文章慷慨地提供了我使用的数据,但是提供的解决方案不是原子操作。MongoDB 4.2是否有可能实现原子解决方案?

查理·斯旺森

这是一个例子:

> db.baz.find()
> db.baz.insert({
...   "_id": ObjectId("4d525ab2924f0000000022ad"),
...   "arrayField": [
...     { id: 1, other: 23 },
...     { id: 2, other: 21 },
...     { id: 0, other: 235 },
...     { id: 3, other: 765 }
...   ],
...   "someOtherArrayField": []
... })
WriteResult({ "nInserted" : 1 })

function extractIdZero(arrayFieldName) {
    return {$arrayElemAt: [
        {$filter: {input: arrayFieldName, cond: {$eq: ["$$this.id", 0]}}}, 
        0
    ]};
}

extractIdZero("$arrayField")
{
    "$arrayElemAt" : [
        {
            "$filter" : {
                "input" : "$arrayField",
                "cond" : {
                    "$eq" : [
                        "$$this.id",
                        0
                    ]
                }
            }
        },
        0
    ]
}

db.baz.updateOne(
    {_id: ObjectId("4d525ab2924f0000000022ad")},
    [{$set: {
         arrayField: {$filter: {
             input: "$arrayField",
             cond: {$ne: ["$$this.id", 0]}
         }},
         someOtherArrayField: {$concatArrays: [
             "$someOtherArrayField",
             [extractIdZero("$arrayField")]
         ]}
     }}
    ])
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.baz.findOne()
{
    "_id" : ObjectId("4d525ab2924f0000000022ad"),
    "arrayField" : [
        {
            "id" : 1,
            "other" : 23
        },
        {
            "id" : 2,
            "other" : 21
        },
        {
            "id" : 3,
            "other" : 765
        }
    ],
    "someOtherArrayField" : [
        {
            "id" : 0,
            "other" : 235
        }
    ]
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何通过特征将对象从一个数组移动到另一个数组?

Javascript:将对象从一个数组移动到另一个数组:最佳方法?

如何按特征将对象从一个数组移动到另一个数组?

在一个数组中合并两个对象,一个对象的键嵌套在 Mongo DB 的同一文档中比另一个更深

如何在MongoDB更新中将字段的值推入同一文档的另一个数组字段中

将对象从一个数组移到另一个数组

将对象从一个数组推到另一个数组

在 PHP 中将值从一个数组移动到另一个数组

Javascript:尝试将项目从一个数组随机移动到另一个数组

根据条件将对象从一个数组添加到另一个数组

将对象值从一个对象数组移动到另一个对象数组

使用 JQ / pyjq 进行 JSON 转换。将对象从一个对象数组移动到另一个数组,由一个标识字段匹配

将数组元素从一个数组位置移动到另一个位置

如何将数组的值从一个数组移动到另一个 [Javascript]

在使用 API 和 ANGULAR 7 选择对象时,我们如何将对象从一个数组移动到另一个数组?

如何在 Java 中从一个数组中提取正数并将它们移动到另一个数组?

Mongodb如何将特定对象从数组移动到另一个数组?

MongoDB-如何验证同一文档的另一个嵌套数组项中是否包含嵌套数组项?

如何通过与另一个数组比较从一个数组中删除公共元素

如何在JavaScript中从一个数组过滤另一个数组的对象?

如何将对象从对象中的数组推到另一个数组?

Javascript:通过内部数组的键将对象推入另一个数组内的数组中

Django将对象从一个数据库移动到另一个数据库

在将其值移动到另一个数组后显示整个数组

通过另一个数组中的值过滤一个数组?

如何根据 id_item 将元素移动到另一个数组

如何在jquery中将对象属性从一个数组对象推送到另一个数组对象?

将对象数组复制到JavaScript中的另一个数组

将数组结果从一个json对象移动到另一个