mongodb更新和/或更改数组键而不使用该值

时间:2015-06-01 06:14:45

标签: mongodb mongojs

我无法从我的mongodb中删除/重命名数组对象。

{ 
    "_id" : ObjectId("556a7e1b7f0a6a8f27e01b8a"), 
    "accountid" : "AC654164545", 
    "sites" :[ 
       { "site_id" : "example1.com" }, 
       { "002" : "example2.com" }, 
       { "003" : "example3.com" }, 
       { "004" : "example4.com" }, 
       { "005" : "example5.com" }, 
       { "006" : "example6.com" } 
    ]}
}

请注意数组键" site_id",我想将其更改为" 001"通过删除和附加它,我知道该怎么做,或重命名它。

我试过了:

db.accounts.update({'id':ObjectId("556a7e1b7f0a6a8f27e01b8a")}, {$unset: {sites.site_id}})

但那表示"意外的令牌"。 所以我试过了:

db.accounts.update({'id':ObjectId("556a7e1b7f0a6a8f27e01b8a")}, {$unset: {sites:site_id}})

那说" site_id没有定义"

然后我尝试了:

db.accounts.update({'id':ObjectId("556a7e1b7f0a6a8f27e01b8a")}, {$unset: {sites:'site_id'}})

那说WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

我还尝试了$rename命令:

db.accounts.update( { _id:ObjectId("556a7e1b7f0a6a8f27e01b8a") }, { $rename: { "sites.site_id": "sites.001" } } )

但是这给了我一个"不能使用part(sites.site_id的网站)来遍历元素"

一种选择是使用.find(),迭代和delete。将未删除的文件保存到一个对象中,然后运行.insert()命令,但如果我有这个命令,我想远离它。

2 个答案:

答案 0 :(得分:0)

此网站讨论动态重命名:http://docs.mongodb.org/manual/reference/operator/update/positional/

Aka首先进行匹配查询,然后使用$将其与数组中的索引进行匹配。

以下是您为所提供的测试数据完成所需的查询:

db.accounts.update({'accountid':"AC654164545", "sites.site_id": "example1.com"}, {$set: {"sites.$": {'001': 'example1.com'}}})

答案 1 :(得分:0)

建议不要使用数字等动态值作为文档结构中的键。使用此类值进行查询会更加困难。

您可以使用$set$elemMatch获得如下结果:

db.collection.update({
    '_id': ObjectId("556a7e1b7f0a6a8f27e01b8a"),
    "sites": {
    $elemMatch: {
        "site_id": "example1.com"
    }
    }
  }, {
    $set: {
    "sites.$":{"001": "example1.com"}
    }
})