mongodb在不使用该值的情况下更新和/或更改数组键
从mongodb中删除/重命名数组对象时遇到问题mongodb在不使用该值的情况下更新和/或更改数组键,mongodb,mongojs,Mongodb,Mongojs,从mongodb中删除/重命名数组对象时遇到问题 { "_id" : ObjectId("556a7e1b7f0a6a8f27e01b8a"), "accountid" : "AC654164545", "sites" :[ { "site_id" : "example1.com" }, { "002" : "example2.com" }, { "003" : "example3.com" }, {
{
"_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的答案中所示的答案。非常感谢。