Arrays 文档中的MongoDB更新数组
我尝试使用此查询更新多个文档的数组:Arrays 文档中的MongoDB更新数组,arrays,mongodb,updates,Arrays,Mongodb,Updates,我尝试使用此查询更新多个文档的数组: db.BusinessRequest.update({"DealTypes": { $exists: true }, "DealTypes.DisplayName": "Minority trade sale" }, {$set:{"DealTypes.$.DisplayName":"Minority"}}, false,true ); 但当存在匹配项时,它只更新数组的第一行,而displayName与第一行不匹配 我使用的是MongoChef软件的Int
db.BusinessRequest.update({"DealTypes": { $exists: true }, "DealTypes.DisplayName": "Minority trade sale" }, {$set:{"DealTypes.$.DisplayName":"Minority"}}, false,true );
但当存在匹配项时,它只更新数组的第一行,而displayName与第一行不匹配
我使用的是MongoChef软件的IntelliShell
我的文档如下所示:
{
"_id" : BinData(4, "IKC6QJRGSIywmKTKKRfTHA=="),
"_t" : "InvestorBusinessRequest",
"Title" : "Business Request 000000002",
"DealTypes" : [
{
"_id" : "60284B76-1F45-49F3-87B5-5278FF49A304",
"DisplayName" : "Majority",
"Order" : "001"
},
{
"_id" : "64A52AFE-2FF5-426D-BEA7-8DAE2B0E59A6",
"DisplayName" : "Majority trade sale",
"Order" : "002"
},
{
"_id" : "C07AE70D-4F62-470D-BF65-06AF93CCEBFA",
"DisplayName" : "Minority trade sale",
"Order" : "003"
},
{
"_id" : "F5C4390A-CA7D-4AC8-873E-2DC43D7F4158",
"DisplayName" : "Equity fund raising",
"Order" : "004"
}
]
}
请问我怎样才能做到这一点?提前谢谢
编辑:
这条线路的工作原理是:
db.BusinessRequest.update({"DealTypes": { $exists: true }, "DealTypes": { $elemMatch: {"DisplayName": "Majority trade sale"}}}, {$set:{"DealTypes.$.DisplayName":"Majority"}}, false,true );
更新中的最后两个参数有问题 这是mongodb中update()方法的形式
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
更新中的最后两个参数有问题 这是mongodb中update()方法的形式
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
请试试这个:
db.BusinessRequest.find().forEach( function(doc) {
do {
db.BusinessRequest.update({{"DealTypes": { $exists: true }, "DealTypes.DisplayName": "Minority trade sale" },
{$set:{"DealTypes.$.DisplayName":"Minority"}});
} while (db.getPrevError().n != 0);
})
或
不能在一次更新操作中修改多个数组元素。因此,为了迁移需要修改多个数组元素的文档,您必须重复更新。您可以通过迭代集合中的每个文档,重复应用带有$elemMatch
的更新,直到文档的所有相关注释都被替换为止
db.BusinessRequest.update({"DealTypes": { $exists: true }, "DealTypes": { $elemMatch: {"DisplayName": "Majority trade sale"}}}, {$set:{"DealTypes.$.DisplayName":"Majority"}}, false,true );
如果您需要提高搜索效率,我建议您将模式标准化,其中每一行都保存在单独的文档中。请尝试以下操作:
db.BusinessRequest.find().forEach( function(doc) {
do {
db.BusinessRequest.update({{"DealTypes": { $exists: true }, "DealTypes.DisplayName": "Minority trade sale" },
{$set:{"DealTypes.$.DisplayName":"Minority"}});
} while (db.getPrevError().n != 0);
})
或
不能在一次更新操作中修改多个数组元素。因此,为了迁移需要修改多个数组元素的文档,您必须重复更新。您可以通过迭代集合中的每个文档,重复应用带有$elemMatch
的更新,直到文档的所有相关注释都被替换为止
db.BusinessRequest.update({"DealTypes": { $exists: true }, "DealTypes": { $elemMatch: {"DisplayName": "Majority trade sale"}}}, {$set:{"DealTypes.$.DisplayName":"Majority"}}, false,true );
如果您需要提高搜索效率,我建议您规范化模式,其中每一行都保存在单独的文档中。请在mongo shell中执行以下脚本:
db.BusinessRequest.find({"DealTypes":{$exists:true}}).forEach(function(item)
{
for(i=0;i < item.DealTypes.length;i++)
{
if(item.DealTypes[i].DisplayName === 'Minority trade sale'){
item.DealTypes[i].DisplayName = 'Minority';
}
}
db.BusinessRequest.save(item);
});
db.BusinessRequest.find({“DealTypes”:{$exists:true}).forEach(函数(项)
{
对于(i=0;i
请在mongo shell中执行以下脚本:
db.BusinessRequest.find({"DealTypes":{$exists:true}}).forEach(function(item)
{
for(i=0;i < item.DealTypes.length;i++)
{
if(item.DealTypes[i].DisplayName === 'Minority trade sale'){
item.DealTypes[i].DisplayName = 'Minority';
}
}
db.BusinessRequest.save(item);
});
db.BusinessRequest.find({“DealTypes”:{$exists:true}).forEach(函数(项)
{
对于(i=0;i
而不是=
,它应该是:
。multi:true不在嵌套字段中搜索。所以这是行不通的。您的查询将具有与原始查询相同的效果。@PratikGujarathi是的,完全相同的效果:仍然无效。您可以尝试类似于我在下面发布的解决方案的方法。我不认为有任何直接的方法可以做到这一点。它应该是:
,而不是=
。multi:true不在嵌套字段中搜索。所以这是行不通的。您的查询将具有与原始查询相同的效果。@PratikGujarathi是的,完全相同的效果:仍然无效。您可以尝试类似于我在下面发布的解决方案的方法。我不认为有任何直接的方法可以做到这一点。我尝试使用$elemMatch,它似乎起作用:db.BusinessRequest.update({“DealTypes”:{$exists:true},“DealTypes”:{$elemMatch:{“DisplayName”:“多数交易销售”}},{$set:{“DealTypes.$.DisplayName”:“多数”},false,true)代码>如果有效!然后投票并接受答案。让其他人也知道。我尝试使用$elemMatch,它似乎起作用:db.BusinessRequest.update({“DealTypes”:{$exists:true},“DealTypes”:{$elemMatch:{“DisplayName”:“多数交易销售”}}},{$set:{“DealTypes.$.DisplayName”:“多数”},false,true)代码>如果有效!然后投票并接受答案。让其他人也知道。