给出如下的集合:
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每个修饰符来插入新元素。但我很难找到要执行推送操作的数组的$位置。另一个警告是,我想保留旧水果的位置以获得新的水果。即第一批新水果与旧水果的位置相同。
答案 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
运算符会将元素插入到数组的末尾。