Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新多个文档/在新数组中添加键及其值_Javascript_Mongodb_Mongodb Query - Fatal编程技术网

Javascript 更新多个文档/在新数组中添加键及其值

Javascript 更新多个文档/在新数组中添加键及其值,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,我有一个名为inventory的集合,其中我有多个文档,每个文档都有值 { "apples": 2 ,"oranges": 3, "carrots": 5 } { "apples": 4, "oranges": 6, "carrots": 9 } 如何更新将所有水果推送到多个文档上的单个数组中,如下所示: { "fruits": { "apples":2 ,"oranges":3 }, "carrots": 5 } 这里首先要注意的是,您给出的示例不是数组,而是具有不同键的“水果”的子文档

我有一个名为inventory的集合,其中我有多个文档,每个文档都有值

{ "apples": 2 ,"oranges": 3,  "carrots": 5 }
{ "apples": 4, "oranges": 6, "carrots": 9 }
如何更新将所有水果推送到多个文档上的单个数组中,如下所示:

{ "fruits": { "apples":2 ,"oranges":3 }, "carrots": 5 }

这里首先要注意的是,您给出的示例不是数组,而是具有不同键的“水果”的子文档。MongoDB中的“数组”如下所示:

{“水果”:[{“苹果”:2},{“橙色”:3}],“胡萝卜”:5}

此外,除了“水果”这一术语是主观的,因为没有其他标识符,你必须指定一个“水果”的“列表”,另一个要考虑的是,目前在MunGDB中没有实际的方法来引用一个字段在处理更新时的现有值。 这意味着您需要

.find()
检索每个文档中的数据,以便能够使用您想要的那种“重新结构”。这实质上意味着对每个文档循环执行
.update()
操作

对于MongoDB 2.6及更高版本,至少可以批量发送对数据库的“写入”操作,而不是一次发送一个操作,在这里可能会有所帮助:

var bulk=db.collection.initializeOrderedBulkOp();
var计数=0;
var水果=[“苹果”、“橙子”];
var unset={};
水果。forEach(功能(水果){
未结[果]=1;
});
db.collection.find({}).forEach(函数(doc){
var字段=[];
水果。forEach(功能(水果){
如果(文件hasOwnProperty(水果)){
var subDoc={};
子文档[结果]=文档[结果];
字段。推送(子文档);
}
});
bulk.find({“\u id”:doc.\u id}).updateOne({
“$unset”:unset,“$push”:{“水果”:{“$each”:fields}
});
计数++;
如果(计数%1000==0){
bulk.execute();
var bulk=db.collection.initializeOrderedBulkOp();
}
});
如果(计数%1000!=0)
bulk.execute();
它还使用了的修饰符,以便一次添加多个数组项。对于文档中不存在的字段,可以安全地调用运算符,因此无需检查文档中是否存在这些字段,因为在将元素数组构造为
$push
时,需要检查这些字段

当然,如果您确实想要一个文档,如您给出的示例所示,它实际上不是一个数组,那么您可以使用不同的运算符进行构造:

var字段={};
水果。forEach(功能(水果){
如果(文件hasOwnProperty(水果))
字段[水果]=文档[水果];
});
bulk.find({“\u id”:doc.\u id}).updateOne({
“$unset”:unset,“$set”:{“水果”:字段}
});

不管是什么情况,都需要循环现有集合。没有任何操作允许您“获取”文档中的现有值并“使用它”,以便从服务器端的角度设置新值。

您能更好地解释一下该怎么做吗?因为我不明白你们为什么要谈论数组。我只看到一份文件清单。谢谢我需要的是把所有的水果放在一个共同的键下,水果作为一个子文档嗨,尼尔,谢谢,我正在学习Mongodb。你是对的,它是一个子文档。我需要将各种水果分组到一个关键水果中。是否有任何捷径或任何直接的CRUD操作来更新多个文档,而无需任何其他代码。谢谢你的时间。Thanksnel的回答指出,除了一些特殊操作(如
$inc
)的例外情况外,没有一种方法(目前为2.6)可以引用文档中字段的现有值进行更新。您需要按照Neil的建议做一些事情。@pjsucces正如答案所解释的,MongoDB目前无法在原子更新中使用一个字段的现有值来更新另一个字段。例如set A=B。如图所示的方法需要检索文档信息以发布单独的更新。这基本上就是你必须要做的。@wdberkeley如果你想让其他评论者得到你的信息,你必须特别向他们发表意见。否则,唯一看到评论的人就是你留下评论的问题或答案的海报。谢谢尼尔,你们太棒了。