【问题标题】:Move an array element from one array position to another (mongo)将数组元素从一个数组位置移动到另一个位置(mongo)
【发布时间】:2023-03-29 20:00:01
【问题描述】:

我有一个这样的列表:

{ 
    arr: [
        { _id: 'a', val: 1 }, 
        { _id: 'b', val: 4 }, 
        { _id: 'd', val: 0 }, 
        { _id: 'c', val: 8 }
    ] 
}

我需要将元素 {_id: c} 放在元素 {_id: d} 之前。我怎么能用mongo做到这一点?当然,我可以将文档下载到我的服务器上,准备好后上传到 mongo 服务器。但我认为,这不是一个好方法。

P.S:抱歉,我需要移动元素(将其推到新位置并从旧位置移除)

【问题讨论】:

  • 我认为更简单的方法是创建另一个您可以更轻松访问的 id,并在需要使用文档时按该 id 排序。
  • 您想交换元素还是对它们进行排序?如果您需要对它们进行排序,可以使用 $sort 选项。
  • 有人找到解决办法了吗?

标签: arrays node.js mongodb


【解决方案1】:

您可以使用关键字$position 指定要在数组中插入值的位置。当$pushing 一个元素时使用它,您将能够将该元素插入到数组中的特定位置。

db.collection.update(
    {parameter: doc},
    {$push: {
        arr: {
            $each: [{_id: "c", val: 8}],
            $position: 2
        }
    })

这会将对象推到数组的位置 2。如果您希望通过删除特定点的对象来操作数组,可以参考answer I linked in the comments

【讨论】:

  • 不错,他是如何删除位置 3 的元素的?也许一个可行的例子会很好。
  • 还有更多方法可以做到这一点,使用$pull。我不知道你是否可以在$pull 中指定一个$position 字段,但还有其他答案:stackoverflow.com/questions/4969768/…
  • 那么位置 2 的文档呢
  • $push 不会删除位置 3 的文档,并且 OP 没有要求删除它,因此此代码保留数组并仅插入。但是@Soren 询问是否要删除某个位置的元素,所以我提供了一个链接来使用$pull
  • 这个问题的作者特别要求将元素从一个位置移动到另一个位置,而不是推送一个新元素。这是对了一半的答案。
【解决方案2】:

试试这个:

db.myCollection.find().forEach(function(doc){
        db.myCollection.update({_id: doc._id},
          {$set: {"arr.2": doc.arr[3], "arr.3": doc.arr[2]}})
    })
OR
You can Pull and then push those documents

【讨论】:

  • >> 当然,我可以将文档下载到我的服务器,准备好后上传到 mongo 服务器。但我认为,这不是一个好方法。
  • 回调是否不会将其复制到应用程序而不仅仅是在 mongodb 服务器上工作?
  • @Soren 是的,但如果我将在 mongodb 服务器上工作,我将阻塞主线程。
  • 不确定这是否相关,因为 OP 特别想要一些不会复制数据的东西。
猜你喜欢
  • 2011-07-15
  • 2017-11-04
  • 2017-10-19
  • 2013-06-28
  • 2018-10-15
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多