如何重命名mongodb中的所有密钥?

时间:2016-04-07 13:10:26

标签: mongodb mongodb-query

我有这样的文件:

{
    "_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 

2 个答案:

答案 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中已提及的$renamethis answerupdateMany()方法也没有采用" 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": "" } }
)