gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:04:19 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com