mongodb:用一个或多个元素替换数组中的元素

时间:2015-08-17 10:07:05

标签: mongodb pymongo pymongo-3.x

给出如下的集合:

element {
    z-index: 1;
    visibility: visible;
}

我想用“樱桃”和“日期”替换所有“香蕉”的实例。因此产生的集合将是:

{
   _id: 1,
   fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],
}
{
   _id: 2,
   fruits: [ "plums", "kiwis", "oranges"],
}
{
   _id: 3,
   fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],
}

我通过pymongo使用的一种方法:

{
   _id: 1,
   fruits: [ "apples", "pears", "oranges", "grapes", "cherries", "dates"],
}
{
   _id: 2,
   fruits: [ "plums", "kiwis", "oranges"],
}
{
   _id: 3,
   fruits: [ "plums", "kiwis", "oranges", "cherries", "dates", "apples"],
}

我正在寻找一种更有效的方法,使用update命令来拉动/移除匹配的元素,并使用$ push每个修饰符来插入新元素。但我很难找到要执行推送操作的数组的$位置。另一个警告是,我想保留旧水果的位置以获得新的水果。即第一批新水果与旧水果的位置相同。

1 个答案:

答案 0 :(得分:1)

同一命令中相同键的push and pull的MongoDB更新不适用于更多check this

首先,您应该使用此命令pull来自bananas数组的所有fruits

db.collection.update({},{"$pull":{"fruits":"bananas"}},true,false)

首先true用于多个文档,例如{multi:true},以便从bananas数组中提取fruits,然后添加香蕉替换为"樱桃"和"约会"像这样使用$push

db.collection.update({},{"$push":{"fruits":{"$each":["cherries","dates"]}}},true,true)

修改

如果你想要吨插入只有那些文件包含bananas然后先推,然后像这样拉:

db.collection.update({"fruits":{"$in":["bananas"]}},{"$push":{"fruits":{"$each":["cherries","dates"]}}},true,true)

然后拉bananas

db.collection.update({"fruits":{"$in":["bananas"]}},{"$pull":{"fruits":"bananas"}},true,true)

第二次修改

如果cherries and dates插入位置bananas,那么首先找出bananas在数组中的位置,但这不可能直接使用mongo查询,所以这里使用了一些脚本代码(这里我使用了JavaScript)使用mongo bulk它将更新文档检查以下代码:

var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;
db.collectionName.find({"fruits":{"$in":["bananas"]}}).forEach(function(data){
var postion = data.fruits.indexOf("bananas");
    bulk.find({"_id":data._id}).updateOne({"$push":{"fruits":{"$each":["cherries","dates"],"$position":postion}}},true,true);
    bulk.find({"_id":data._id}).updateOne({"$pull":{"fruits":"bananas"}},true,true);
     counter++;
if ( counter % 1000 == 0 ) {
          bulk.execute();
          bulk = db.collectionName.initializeOrderedBulkOp();
      }
});

if ( counter % 1000 != 0 ){
    bulk.execute();
}

$postion修饰符指定数组中$push运算符插入元素的位置。如果没有$position修饰符,$push运算符会将元素插入到数组的末尾。