如何在MongoDB shell中更新数组对象值
我想更新嵌套数组对象中包含ObjectId的所有MongoDB文档 我的医生是:如何在MongoDB shell中更新数组对象值,mongodb,mongodb-query,Mongodb,Mongodb Query,我想更新嵌套数组对象中包含ObjectId的所有MongoDB文档 我的医生是: { "_id" : ObjectId("5a61a6bdae8bdc26685f8c27"), "variant_count" : 1, "salts" : [ { "name" : "Cetirizine", "classification" : "HD", "dosage" : 0.0, "is_cold_storag
{
"_id" : ObjectId("5a61a6bdae8bdc26685f8c27"),
"variant_count" : 1,
"salts" : [
{
"name" : "Cetirizine",
"classification" : "HD",
"dosage" : 0.0,
"is_cold_storage" : false,
"id" : ObjectId("5a61a292ae8bdc26685f2a91")
}]
"drug_category" : "DRUGS",
"name" : "Adicold Tab",
}
我想将所有salts.id更新为字符串
例如
{
"_id" : ObjectId("5a61a6bdae8bdc26685f8c27"),
"variant_count" : 1,
"salts" : [
{
"name" : "Cetirizine",
"classification" : "HD",
"dosage" : 0.0,
"is_cold_storage" : false,
"id" : "5a61a292ae8bdc26685f2a91"
}]
"drug_category" : "DRUGS",
"name" : "Adicold Tab",
}
这是我的作品:
db.product.find({"salts.id" : {$type : 7}}).forEach(
function(doc) {
var salts = doc.salts;
var newSalts = [];
if (Array.isArray(salts) && salts.length > 0) {
for (i = 0; i < salts.length; i++) {
salt = salts[i];
if (salt['id'] != null && typeof salt['id'] == 'object') {
salt['id'] = salt['id'].str
newSalts.push(salt)
} else {
newSalts.push(salt)
}
}
db.product.update( { _id: doc._id }, { $set: { salts: newSalts } }
);
i = i + 1;
}
}
);
db.product.find({“salts.id”:{$type:7}).forEach(
功能(doc){
var盐=doc盐;
var newSalts=[];
if(数组isArray(salts)和salts.length>0){
对于(i=0;i
您可以像更改任何其他字段类型一样更改它。下面的链接将为您提供解决方案。只需将字段名用作salts.id。谢谢@初学者它帮助我解决了我的问题,也发布了同样的更新查询,请查看,如果需要任何其他优化,请让我知道如果这对你有效,请继续。我认为不需要任何优化,因为此更新只运行一次。它不是一个循环函数。但是,是的,如果您计划在生产数据库中运行它,并且它不是一个强制字段,我建议您首先运行一些测试,特别是使用“集合中没有这样的字段”、“字段分配为null而不是未定义”等变体。真的有理由更新它吗?因为大多数驱动程序都提供了对象ID的字符串表示,对于.net驱动程序来说,它只是变量上的注释。啊,好的。我建议你做些测试。另外,不要认为你需要其他部分。如果id存在,请将其更改为string并调用update。祝你好运
**This code is working fine for me.**
db.collectionName.find({}).forEach(function(item){
if (item) {
item.salts.forEach(function(data){
if(data){
data.id = data.id.valueOf();
}
})
db.collectionName.save(item);
}
})