我有这样的文件:
{
"_id" : ObjectId("5705fe62d0d50b2316617508"),
"date" : ISODate("2016-04-07T11:12:43.917Z"),
}
{
"_id" : ObjectId("5705fe62d0d50b2316617508"),
"date" : ISODate("2016-04-07T11:12:43.917Z"),
"XString" : "bb"
}
{
"_id" : ObjectId("5705fe62d0d50b2316617508"),
"date" : ISODate("2016-04-07T11:12:43.917Z"),
"XString" : "ba"
}
{
"_id" : ObjectId("5705fe62d0d50b2316617508"),
"date" : ISODate("2016-04-07T11:12:43.917Z"),
"XString" : "dd"
}
我如何更新密钥" XString"到"姓名"如果XString不在那里,它应该添加" Name"
尝试使用$ rename作为:
db.articles.update({}, {$set:{$rename: {'XString':'Name'}}},{upsert:true});
但它会出错:
The dollar ($) prefixed field '$rename' in '$rename' is not valid for storage.
尝试其他方式:
db.articles.update({}, {$rename: {'XString': 'Name'}}, false, true);
but its not adding the key is it does not exists
答案 0 :(得分:3)
错误的选择。您想要"multi"
而不是"upsert"
:
db.articles.update(
{ "XString": { "$exists": true } },
{ "$rename": { 'XString': 'Name' } },
{ "multi": true }
);
$exists
测试确保您只选择您重命名的密钥实际存在的文档。
另外$rename
是一个"更新修饰符"这意味着它是一个顶级" "更新"的论点文档。
"multi"
意味着影响所有匹配的文档,而不仅仅是"第一个"。
如果你想要一个"空白"键实际上不存在的值然后你做相反的操作,最好是在$rename
操作之后:
db.articles.update(
{ "Name": { "$exists": false } },
{ "$set": { 'Name': '' } },
{ "multi": true }
);
答案 1 :(得分:1)
如果您的MongoDB服务器版本是3.2,则可以使用updateMany()
方法。当然,您需要使用$exists
中已提及的$rename
和this answer。 updateMany()
方法也没有采用" multi"选项。
最后但并非最不重要的主要驱动程序弃用了自3.0版以来的update()
方法
以下查询重命名" XString"到"姓名"在哪里" XString"存在。
db.articles.updateMany(
{ "XString": { "$exists": true } },
{ "$rename": { "XString": "Name" } }
)
设置默认值,其中" XString"不存在,请使用$set
更新运算符。
db.articles.updateMany(
{ "Name": { "$exists": false } },
{ "$set": { "Name": "" } }
)