繁体   English   中英

如何使用猫鼬将 MongoDB 中的元素从一个数组位置移动到另一个位置?

[英]How to shift element from one array position to another in MongoDB with mongoose?

我在 MongoDB 中有一个对象数组,我正在将特定元素 id(即 1)从其位置移动到具有 id(即 2)的下方元素。 这样我们就可以得到 id 为 2 -> 1 -> 3 的元素。

const arr = [
  {
    id: 1,
    name: 'foo'
  },
  {
    id: 2,
    name: 'bar'
  },
  {
    id: 3,
    name: 'zoo'
  }
]

我所做的是使用 $pull 和 $push 但它提供了ConflictingUpdateOperators ,我不知道如何处理它。

updatedPlan = await Plan.findOneAndUpdate(
        { _id: req.params.id },
        {
          $pull: {
                    "arr": {
                        id: 1
                    }
          },
          $push: {
                  "arr" : {
                    $each: [{ id: 1, name: 'foo'}],
                    $position: 1
                  }
          },
      );

在 MongoDB 4.2 或更高版本中,您可以使用聚合管道更新文档。 $range数组索引上使用简单的$map ,您可以对这些索引进行混洗并使用$arrayElemAt来构建新数组:

db.col.update({ _id: req.params.id }, [
    {
        $set: {
            arr: {
                $map: {
                    input: { $range: [ 0, { $size: "$arr" } ] },
                    in: {
                        $let: {
                            vars: {
                                newIndex: {
                                    $switch: {
                                        branches: [
                                            { case: { "$eq": [ "$$this", 0 ] }, then: 1 },
                                            { case: { "$lte": [ "$$this", 1 ] }, then: { $subtract: [ "$$this", 1 ] } },
                                        ],
                                        default: "$$this"
                                    }
                                }
                            },
                            in: {
                                $arrayElemAt: [ "$arr", "$$newIndex" ]
                            }
                        }
                    }
                }
            }
        }
    }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM