将数组元素从一个位置移动到另一个位置(mongo)。

3

我有一个这样的列表:

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

我需要在元素{_id: d}之前插入元素{_id: c},请问如何使用mongo实现?当然,我可以下载文档到我的服务器,准备好后再上传到mongo服务器。但我认为这不是一个好方法。注:对不起,我需要移动元素(将其推到新位置并从旧位置删除)

我认为更简单的方法是创建另一个可以更轻松访问的ID,并在需要使用文档时按照该ID进行排序。 - DrakaSAN
你想交换元素还是对它们进行排序?如果需要排序,可能可以使用 $sort 选项。 - Soren
有人找到解决方案了吗? - DecPK
2个回答

1
你可以使用关键字$position指定要插入值的数组位置。在$push元素时使用它,您将能够将该元素插入到数组中特定的位置。
db.collection.update(
    {parameter: doc},
    {$push: {
        arr: {
            $each: [{_id: "c", val: 8}],
            $position: 2
        }
    })

这将把该对象推到数组的第二个位置。如果您想通过删除特定点处的对象来操作数组,可以参考我在评论中链接的答案

很棒,他如何删除第3个位置的元素呢?或许一个可行的示例会很有帮助。 - Soren
有更多的方法可以使用 $pull 来实现。我不知道在 $pull 中是否可以指定 $position 字段,但是这里有其他的答案:https://dev59.com/XlTTa4cB1Zd3GeqPqj1P - Gibryon Bhojraj
那么第二个位置上的文档呢? - Shantanu Madane
$push 不会删除第三个位置的文档,而且 OP 没有要求删除它,所以这段代码保留了数组并插入。但是 @Soren 问如何在特定位置删除元素,因此我包含了一个使用 $pull 进行删除的链接。 - Gibryon Bhojraj
这个问题的作者特别要求将元素从一个位置移动到另一个位置,而不是推入一个新元素。这是一半正确的答案。 - DecPK

0

试试这个:

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
@Soren 是的,但如果我在mongodb服务器上工作,我将会阻塞主线程。 - Саша Вульф
不确定这是否相关,因为OP明确希望找到一些不复制数据的方法。 - Soren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接