mongodb - 根据mongodb中另一个数组字段的值将数组字段添加到集合中

标签 mongodb mongodb-query aggregation-framework

我有一个集合,其结构如下,如一个文档所示

{
_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']
    }

基本上是向集合中的所有文档添加一个新的数组元素,并将其内容设置为一个数组,该数组是文档的 array1 中所有元素的 fld1 值。

我查看了Update MongoDB field using value of another field但不知怎的,我不明白如何提取某些元素。

最佳答案

因此,您应该从您引用的问题中意识到,在更新另一个字段时,您实际上无法引用文档中的另一个值,而无需实际查找文档并循环结果以生成更新。

因此,最重要的是,您实际上可以在代码中执行此操作,读取每个文档并从中提取新值以形成新数组。创建新数组可以使用 $set 来完成或者使用 $push 可能更安全和 $each更新中的运算符。

理想情况下,您还可以使用 Bulk Operations API也可以获得最佳的更新形式。

最后,您还可以将一些数组构建工作负载委托(delegate)给 aggregation framework而不是在客户端代码中处理所有内容,但仍然需要对结果执行更新:

var bulk = db.collection.initializeOrderedBulkOp();
var count = 0;

var cursor = db.collection.aggregate([
    { "$project": {
        "array2": {
            "$map": {
                "input": "array1",
                "as": "el",
                "in": "$$el.fld1"
            }
        }
    }}
]);

cursor.forEach(function(doc) {
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$push": { "array2": { "$each": doc.array2 } }
    });
    count++;

    // send and drain once every 1000 documents
    if ( count % 1000 == 0 ) {
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }
});

// If the counter is uneven then send
if ( count % 1000 != 0 )
    bulk.execute();

所以就这样了。您可以将聚合框架与$map一起使用像这样的运算符以便从数组中提取所需的元素,或者您可以使用类似的方法在代码中执行此操作,因为您实际上并没有真正“聚合”任何内容。这里的主要情况是,无论您使用哪种语言,您都需要在代码中循环结果。

当然,如果您可以接受仅创建一个具有更改结果的"new"集合,那么$out聚合的管道阶段可能很适合您:

db.collection.aggregate([
    { "$project": {
        "array1": 1,
        "array2": {
            "$map": {
                "input": "array1",
                "as": "el",
                "in": "$$el.fld1"
            }
        }
    }},
    { "$out": "newcollection" }
]);

简而言之,您需要部分或全部这些技术才能获得您正在寻找的更改后的集合结果。因此,要么直接使用它,要么实现其中的一些。

关于mongodb - 根据mongodb中另一个数组字段的值将数组字段添加到集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28655830/

相关文章:

MongoDB - FindOne 和过滤嵌套数组

node.js - 如何在 Mongoose 中执行 id 数组查询?

mongodb - 具有两级未知父键的 Mongo 查询嵌套字段值

python - 将 SQL 查询转换为 mongo 查询

json - 数据未从 Node.js 保存到 MongoDB 中

javascript - 如何使用 Node JS 打印整个 mongoDB 集合

mongodb - 通过 mongodb 加权平均评分

mongodb - 获取按日期分组的列中不同值的计数 mongodb

string - 在整个集合的字符串字段中查找最常用的词

mongodb - 如何在 mongo-go-driver 中使用 ParseExtJSONArray() 解析聚合管道中的扩展 JSON 日期