翻转MongoDB文档中的字段

时间:2014-02-20 23:13:18

标签: mongodb mongodb-query

如果我有一个看起来像这样的文件:

{
    "a" : "val",
    "b" : "another val"
}

如何翻转指定的字段以使结果看起来像

{
    "b" : "val",
    "a" : "another val"
}

我已尝试db.collection.update({}, {$rename:{'a':'b', 'b':'a'}}),但收到错误Field name duplication not allowed with modifiers

2 个答案:

答案 0 :(得分:3)

这是一个经典的硬币洗牌问题。可能你在上面遗漏的是,当你试图在一步中形成这个更新时,你总是会碰到指定相同的field。您必须分多步执行此操作,逻辑上:

db.collection.update({}, {$rename: { 'a': 'c' }})
db.collection.update({}, {$rename: { 'b': 'a' }})
db.collection.update({}, {$rename: { 'c': 'b' }})

但我们可以做得更好,并分两步避免碰撞

db.collection.update({}, {$rename:{ 'a': 'c', 'b': 'd' }})
db.collection.update({}, {$rename:{ 'c': 'b', 'd': 'a' }})

当然这不是一个操作,并不容易,没有你不能引用另一个字段的值并将其更新到另一个字段。

当然,只有当你真的需要更改字段名称时才这样做。 $rename手册页介绍了用例。如果您只是希望看到这样的事情,只需$project您想要的表单:

 db.collection.aggregate([{$project: { a: "$b", b: "$a" }}])

答案 1 :(得分:-1)

值得注意的是,随着MongoDB 2.6中新的批量更新操作的出现,可以在单个服务器端操作中重命名。截至本文发布时,2.6仍处于预先发布状态;您可以查看MongoDB download page的可用性。查看release notes以获取更改和新功能的完整列表。

以下是在单个服务器端命令中执行此字段重命名的mongo shell语法:

var bulk = db.c.initializeOrderedBulkOp();
bulk.find({}).update({$rename: {a:'tmp'}})
bulk.find({}).update({$rename: {b:'a'}})
bulk.find({}).update({$rename: {tmp:'b'}})
bulk.execute()