mongodb - 使用更新操作将字段转换为数组

标签 mongodb mongodb-query

在 Mongo 中,如何仅使用 update 操作将字段转换为仅包含原始值的数组?

给定一个文档:

{
  "field": "x"
}

然后一个或多个更新操作:

db.items.update(...)

应该导致:

{
    "field": ["x"]
}

最佳答案

MongoDB 目前不允许您在更新类型的操作中引用字段的现有值。为了进行引用现有字段值的更改,您需要循环结果。但是数组转换部分很简单:

db.collection.find().forEach(function(doc) {
    db.collection.update(
        { _id: doc._id },
        { "$set": { "field": [doc.field] } }
    );
})

MongoDB 2.6 中的批量更新功能甚至更好:

var batch = [];
db.collection.find().forEach(function(doc) {
     batch.push({
        "q": { _id: doc._id },
        "u": { "$set": { "field": [doc.field] } }
    });

    if ( batch.length % 500 == 0 ) {
        db.runCommand({ "update": "collection", "updates": batch });
        batch = [];
    }
});

if ( batch.length > 0 )
    db.runCommand({ "update": "collection", "updates": batch });

甚至使用新的 Bulk API 助手:

var counter = 0;
var bulk = db.collection.initializeUnorderedBulkOp();
db.collection.find().forEach(function(doc) {
     bulk.find({ _id: doc._id }).update({
         "$set": { "field": [doc.field] } 
    });
    counter++;

    if ( counter % 500 == 0 ) {
        bulk.execute();
        bulk = db.collection.initializeUnorderedBulkOp();
        counter = 0;
    }
});

if ( counter > 0 )
    bulk.execute();

最后两个只会每 500 个项目或任何你想将其调整到 16MB BSON 限制以下的更新发送到服务器。所有更新仍然单独执行,但这从整体操作中消除了大量写入/确认流量并且速度更快。

关于mongodb - 使用更新操作将字段转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24049524/

相关文章:

mongodb - 如何 MongoDB 更新/$设置整个子文档

Java - 如何从 MongoDatabase 类获取 DB 对象,因为 MongoClient.getDB(dbName) 已弃用

javascript - MongoDB 双重插入和推送

spring - MongoDB $pull 数组 2 级

mongodb - meteor 批量更新

mongodb - 如何在 golang 和 mongodb 中通过 id 查找

mongodb - 没有 $unwind 的 $group 内部数组值

如果属性数组不包含对象,MongoDB 会查找文档

java - MongoDb Java异步: Combine Filter and Sort for FindOneAndUpdate

javascript - 平均堆栈 Controller 服务器端未连接到 API