mongodb在不使用该值的情况下更新和/或更改数组键

mongodb在不使用该值的情况下更新和/或更改数组键,mongodb,mongojs,Mongodb,Mongojs,从mongodb中删除/重命名数组对象时遇到问题 { "_id" : ObjectId("556a7e1b7f0a6a8f27e01b8a"), "accountid" : "AC654164545", "sites" :[ { "site_id" : "example1.com" }, { "002" : "example2.com" }, { "003" : "example3.com" }, {

从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}})
表示“未定义站点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" } } )
但这给了我一个“不能使用部分(sites of sites.site_id)遍历元素”


一个选项是使用
.find()
,遍历并
删除它。将未删除的部分保存到对象中,并运行
.insert()
命令,但如果我也这样做了,我想远离它。

此站点讨论动态重命名:

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

以下查询将实现您所提供的测试数据所需的功能:

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

不建议使用动态值(如数字)作为文档结构中的键。使用这些值进行查询会更加困难

您可以使用和获得以下结果:

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

可能的重复并不是真正的重复,因为公认的答案是,除了迭代所有内容之外,没有其他方法可以做到这一点。。。。这是三年前的事了。Tobias为我提供了正确的答案,因为我需要使用$set而不是$rename或$unset。我猜OP想复制现有的值。有可能吗?我想您必须使用一些客户端代码来实现这一点,因为您不允许在动态值上使用$rename(使用
$
选择器)+阵列上可用的更新函数很少()。。。这是同一领域的另一个例子,可以扩展它来处理这个问题:硬编码是可以的。在它的位置使用一个数组来完成这一点是很容易的<代码>搜索['sites.'+site_id]='example1.com'这不起作用,因为它只给了我
WriteResult({“nMatched”:0,“nUpserted”:0,“nModified”:0})
。然而,它让我想到了$set命令,这是Tobias的答案中所示的答案。非常感谢。