如何移动MongoDB数组中的项?

Guy*_*and 8 jquery-ui mongodb

有没有办法更新文档数组以将项目从一个索引移动到另一个索引?例如

{
   name: "myDoc",
   items: ["it1", "it2", "it3"]
}
Run Code Online (Sandbox Code Playgroud)

因此,JQuery-UI可排序事件it2和it3切换了位置.因此,我想更新它们在myDoc中的位置,该位置存储在MongoDB中.

Dat*_*ter 8

这是将元素移动到新位置的另一种方法,它将交换 it2 和 it3 的位置...

  1. 使用 $pull [此处文档]从数组中删除元素 。

    update({"name": "myDoc"}, {$pull: {"items" : "it3"}});
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 $push 将元素插入到新位置。[文档在这里]

    update({"name": "myDoc"}, { 
        $push: { 
            "items" : { $each : [ "it3" ], $position : 1 }
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

何时使用

Pouzor 使用 $set 的答案可能更简单,并且对于许多用例来说性能更好。

但是,如果多个用户同时添加、删除和重新排序数组项,此方法意味着您不会覆盖彼此的更改。

在某些情况下(例如大型数组元素)它也可能更有效,因为写入的数据较少。

陷阱:列表列表

如果您要重新排序的列表是数组的数组,您需要将 $all 运算符与 $pull 一起使用[此处的文档]

举个例子:

{
    name: "myDoc",
    items: [  
        [ "User", "dofij20r91dj93" ],   
        [ "User", "239vjvidjfsldf" ], 
        [ "User", "2309jvdsjdkk23" ]
    ]
}
Run Code Online (Sandbox Code Playgroud)

以下是从列表列表中删除第一个列表的代码:

update({"name": "myDoc"}, {
    $pull: {
        "items" : {
            $all : [ "User", "dofij20r91dj93" ]  // the sub-list to $pull
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

对象列表

这很容易。假设您有以下对象列表:

{
    name: "myDoc",
    items: [  
        { type: "User",  id: "dofij20r91dj93", name: "Dave" },   
        { type: "Group", id: "239vjvidjfsldf", name: "Accountants" }, 
        { type: "User",  id: "2309jvdsjdkk23", name: "Toni" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

你可以这样$pull:

update({"name": "myDoc"}, {
    $pull: { 
        "items" : { type: "User", id: "dofij20r91dj93" } 
    }
});
Run Code Online (Sandbox Code Playgroud)


小智 5

目前,无法使用任何驱动程序直接在 mongo 中执行此操作。

您需要在应用程序中执行此操作并使用 mongo 设置数组。

前任:

var new_array = ["it2","it1","it3"];//Do your sort/place in js

$mongo_connexion->update({"name": "myDoc"}, {$set: {"items" : new_array}});
Run Code Online (Sandbox Code Playgroud)