gpt4 book ai didi

javascript - mongodb 更新 shell 命令应该是什么

转载 作者:可可西里 更新时间:2023-11-01 09:15:04 24 4
gpt4 key购买 nike

这是我收藏的文档之一

{   
"_id": ObjectId("55e86e98f493590878bb45d7"),
"KIDS_M_0_2" : "",
"KIDS_F_0_2" : "",
"KIDS_U_0_2" : "Y",
"KIDS_M_3_5" : "",
"KIDS_F_3_5" : "",
"KIDS_U_3_5" : "Y",
"KIDS_M_6_10" : "",
"KIDS_F_6_10" : "",
"KIDS_U_6_10" : "",
"KIDS_M_11_15" : "",
"KIDS_F_11_15" : "",
"KIDS_U_11_15" : "",
"KIDS_M_16_17" : "",
"KIDS_F_16_17" : "",
"KIDS_U_16_17" : "Y"
}

我想要这样

{
"_id":ObjectId("55e86e98f493590878bb45d7"),
"KIDS": { "KIDS_M_0_2" : "",
"KIDS_F_0_2" : "",
"KIDS_U_0_2" : "Y",
"KIDS_M_3_5" : "",
"KIDS_F_3_5" : "",
"KIDS_U_3_5" : "Y",
"KIDS_M_6_10" : "",
"KIDS_F_6_10" : "",
"KIDS_U_6_10" : "",
"KIDS_M_11_15" : "",
"KIDS_F_11_15" : "",
"KIDS_U_11_15" : "",
"KIDS_M_16_17" : "",
"KIDS_F_16_17" : "",
"KIDS_U_16_17" : "Y"
}

这可以通过 shell 完成吗,我的更新命令应该是什么。 ?

最佳答案

实际上你需要的不仅仅是简单的命令。

您需要遍历 .find() 返回的游标使用 .forEach() 的方法方法然后使用字段的名称及其值创建一个新对象“kids”。接下来要做的是$unset所有字段并使用 $set运算符创建新字段。当然你要这样做你使用 "bulk" 1 操作以获得最高效率。

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

db.collection.find().forEach(function(doc) {
var kids = {};
for(key in doc) {
if(key != '_id' && Object.prototype.hasOwnProperty.call(doc, key)) {
kids[key] = doc[key];
var unset = {};
unset[key] = '';
bulk.find( { '_id': doc._id } ).updateOne( { '$unset': unset } );
count++;
}
bulk.find( { '_id': doc._id } ).updateOne({ '$set': { 'KIDS': kids } } );
if (count % 500 === 0) {
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})

if (count > 0)
bulk.execute()

完成此操作后,您的文档如下所示:

{
"_id" : ObjectId("567d99bcbc08a0817a1b06dd"),
"KIDS" : {
"KIDS_M_0_2" : "",
"KIDS_F_0_2" : "",
"KIDS_U_0_2" : "Y",
"KIDS_M_3_5" : "",
"KIDS_F_3_5" : "",
"KIDS_U_3_5" : "Y",
"KIDS_M_6_10" : "",
"KIDS_F_6_10" : "",
"KIDS_U_6_10" : "",
"KIDS_M_11_15" : "",
"KIDS_F_11_15" : "",
"KIDS_U_11_15" : "",
"KIDS_M_16_17" : "",
"KIDS_F_16_17" : "",
"KIDS_U_16_17" : "Y"
}
}

MongoDB 3.2 deprecates Bulk() 及其相关方法并提供 .bulkWrite()方法。

var operations = [];

db.collection.find().forEach(function(doc) {
var kids = {};
for(var key in doc) {
if(!key.startsWith('_id') && Object.prototype.hasOwnProperty.call(doc, key)) {
kids[key] = doc[key];
var unset = {};
unset[key] = '';
operations.push(
{ 'updateOne':
{
'filter': { '_id': doc._id } ,
'update': { '$unset': unset }
}
}
);
}
operations.push(
{ 'updateOne':
{
'filter': { '_id': doc._id } ,
'update': { '$set': { 'KIDS': kids } }
}
}
);
}
operations.push( { 'ordered': true } );
})

db.collection.bulkWrite(operations)

1.Bulk() API 是 2.6 版中的新增功能。所以如果你使用的是旧版本,你应该考虑升级

关于javascript - mongodb 更新 shell 命令应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465680/

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