Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
基于mongodb中另一个数组字段的值向集合添加数组字段_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

基于mongodb中另一个数组字段的值向集合添加数组字段

基于mongodb中另一个数组字段的值向集合添加数组字段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个集合,它有一个文档表示的以下结构 { _id : 1, array1 : [{fld1 : 'doc1e1fld1', fld2: 'doc1e1fld2'},{fld1:'doc1e2fld1',fld2: 'doc1e2fld2'}] } 我想向集合中的所有元素添加另一个字段,并设置值,使上面修改的文档看起来像: { _id : 1, array1 : [{fld1 : 'doc1e1fld1', fld2: 'doc1e1fld2'},{fld1:'doc1e2f

我有一个集合,它有一个文档表示的以下结构

{
_id : 1,
array1 : [{fld1 : 'doc1e1fld1', fld2: 'doc1e1fld2'},{fld1:'doc1e2fld1',fld2: 'doc1e2fld2'}]
}
我想向集合中的所有元素添加另一个字段,并设置值,使上面修改的文档看起来像:

{
    _id : 1,
    array1 : [{fld1 : 'doc1e1fld1', fld2: 'doc1e1fld2'},{fld1:'doc1e2fld1',fld2: 'doc1e2fld2'}],
    array2 : ['doc1e1fld1','doc1e2fld1']
    }
基本上,向集合中的所有文档添加一个新的数组元素,并将其内容设置为一个数组,该数组是文档数组1中所有元素的fld1值


我看了一下,但不知何故,我不明白如何提取某些元素。

因此,您应该从您引用的问题中意识到,在更新另一个字段时,如果不实际查找文档并循环生成结果,您就不能实际引用文档中的另一个值更新

因此,底线是您将在代码中真正做到这一点,读取每个文档并提取新值,从中形成新数组。在更新中使用and运算符可以更安全地创建新阵列

理想情况下,您还可以使用最理想的更新形式

最后,您还可以将部分阵列构造工作负载委托给,而不是在客户端代码中处理所有工作负载,但仍需要对结果执行更新:

var bulk=db.collection.initializeOrderedBulkOp();
var计数=0;
var cursor=db.collection.aggregate([
{“$project”:{
“array2”:{
“$map”:{
“输入”:“数组1”,
“as”:“el”,
“在”:“$$el.fld1”
}
}
}}
]);
cursor.forEach(函数(doc){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$push”:{“array2”:{“$each”:doc.array2}
});
计数++;
//每1000份文件发送和排出一次
如果(计数%1000==0){
bulk.execute();
bulk=db.collection.initializeOrderedBulkOp();
}
});
//如果计数器不均匀,则发送
如果(计数%1000!=0)
bulk.execute();
就是这样。为了从数组中提取所需的元素,您可以将聚合框架与这样的操作符一起使用,或者考虑到您实际上并没有“聚合”任何内容,您也可以使用类似的方法在代码中执行此操作。这里的主要情况是,无论使用何种语言,都需要在代码中循环结果

当然,如果您只需要创建一个具有更改结果的“新”集合,那么aggregate的管道阶段就非常适合您:

db.collection.aggregate([
{“$project”:{
“阵列1”:1,
“array2”:{
“$map”:{
“输入”:“数组1”,
“as”:“el”,
“在”:“$$el.fld1”
}
}
}},
{“$out”:“newcollection”}
]);
简言之,尽管您需要这些技术中的一部分或全部,以便获得您正在寻找的经过修改的收集结果。因此,要么直接使用它,要么实现其中的一部分