mongodb 更新 and/or 更改数组键而不使用值
mongodb update and/or change an array key without using the value
我在 removing/renaming 来自 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}})
但这就是说 "unexpected token"。
所以我尝试了:
db.accounts.update({'id':ObjectId("556a7e1b7f0a6a8f27e01b8a")}, {$unset: {sites:site_id}})
也就是说 "site_id is not defined"
然后我尝试了:
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" } } )
但这给了我一个 "Cannot use part (sites of sites.site_id) to traverse the element"
一种选择是使用 .find()
、遍历并 delete
。将未删除的保存到一个对象中,然后 运行 一个 .insert()
命令,但如果我也有的话,我想远离它。
本站讨论动态重命名:http://docs.mongodb.org/manual/reference/operator/update/positional/
也就是首先进行匹配查询,然后使用 $
将其与数组中的索引相匹配。
下面的查询将根据您提供的测试数据完成您想要的操作:
db.accounts.update({'accountid':"AC654164545", "sites.site_id": "example1.com"}, {$set: {"sites.$": {'001': 'example1.com'}}})
不建议在文档结构中使用数字等动态值作为键。使用此类值查询会更加困难。
您可以使用$set and $elemMatch得到如下结果:
db.collection.update({
'_id': ObjectId("556a7e1b7f0a6a8f27e01b8a"),
"sites": {
$elemMatch: {
"site_id": "example1.com"
}
}
}, {
$set: {
"sites.$":{"001": "example1.com"}
}
})
我在 removing/renaming 来自 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}})
但这就是说 "unexpected token"。 所以我尝试了:
db.accounts.update({'id':ObjectId("556a7e1b7f0a6a8f27e01b8a")}, {$unset: {sites:site_id}})
也就是说 "site_id is not defined"
然后我尝试了:
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" } } )
但这给了我一个 "Cannot use part (sites of sites.site_id) to traverse the element"
一种选择是使用 .find()
、遍历并 delete
。将未删除的保存到一个对象中,然后 运行 一个 .insert()
命令,但如果我也有的话,我想远离它。
本站讨论动态重命名:http://docs.mongodb.org/manual/reference/operator/update/positional/
也就是首先进行匹配查询,然后使用 $
将其与数组中的索引相匹配。
下面的查询将根据您提供的测试数据完成您想要的操作:
db.accounts.update({'accountid':"AC654164545", "sites.site_id": "example1.com"}, {$set: {"sites.$": {'001': 'example1.com'}}})
不建议在文档结构中使用数字等动态值作为键。使用此类值查询会更加困难。
您可以使用$set and $elemMatch得到如下结果:
db.collection.update({
'_id': ObjectId("556a7e1b7f0a6a8f27e01b8a"),
"sites": {
$elemMatch: {
"site_id": "example1.com"
}
}
}, {
$set: {
"sites.$":{"001": "example1.com"}
}
})