Joh*_*nny 11 multidimensional-array mongodb
我在Mongo中有这些数据:
{
"_id" : ObjectId("505fd43fdbed3dd93f0ae088"),
"categoryName" : "Cat 1",
"services" : [
{
"serviceName" : "Svc 1",
"input" : [
{ "quantity" : 10, "note" : "quantity = 10" },
{ "quantity" : 20, "note" : "quantity = 20" }
]
},
{
"serviceName" : "Svc 2",
"input" : [
{ "quantity" : 30, "note" : "quantity = 30" },
{ "quantity" : 40, "note" : "quantity = 40" }
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在我想更新"Svc 1"的数量:
{ "quantity" : 10, "note" : "quantity = 10" }
Run Code Online (Sandbox Code Playgroud)
喜欢:
{"quantity": 100, "note": "changed to 100"}
Run Code Online (Sandbox Code Playgroud)
我怎么能用Mongo做什么?`
据我所知,操作运算符只支持第一个数组,有人建议使用子子数组元素的索引,但问题是如何在运行时知道该索引?(我使用的是MongoDB的原生C#驱动程序)
在此先感谢您的帮助!
约翰尼
Ste*_*nie 11
由于数组中有数组,除非您知道要更新的数组中的位置,否则没有任何简单的方法可以引用嵌套的子数组.
因此,例如,您可以使用C#等效的更新'Svc 1'的第一个输入:
db.services.update(
// Criteria
{
'_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
'services.serviceName' : 'Svc 1'
},
// Updates
{
$set : {
'services.$.input.0.quantity' : 100,
'services.$.input.0.note' : 'Quantity updated to 100'
}
}
)
Run Code Online (Sandbox Code Playgroud)
如果您不知道嵌套input数组的位置,则必须获取匹配项services,input在应用程序代码中迭代数组,然后$set更新更新的数组.
或者,您可以修改嵌套数组以使用嵌入式文档,例如:
{
"categoryName" : "Cat 1",
"services" : [
{
"serviceName" : "Svc 1",
"input1" : { "quantity" : 10, "note" : "quantity = 10" },
"input2" : { "quantity" : 20, "note" : "quantity = 20" }
},
]
}
Run Code Online (Sandbox Code Playgroud)
然后您可以按名称更新,例如input1:
db.services.update(
// Criteria
{
'_id' : ObjectId("5063e80a275c457549de2362"),
'services.serviceName' : 'Svc 1'
},
// Updates
{
$set : {
'services.$.input1.quantity' : 100,
'services.$.input1.note' : 'Quantity updated to 100'
}
}
)
Run Code Online (Sandbox Code Playgroud)
由于您不知道要更新的值的位置,因此首先插入包含更新信息的新值,然后删除要更新的值.
db.services.update(
{
'_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
'services.serviceName' : 'Svc 1'
},
{
{ $addToSet: { 'services.$.input' : "new sub-Doc" }
}
)
Run Code Online (Sandbox Code Playgroud)
插入成功后删除
db.services.update(
{
'_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
'services.serviceName' : 'Svc 1'
},
{
{ $pull: { 'services.$.input' : { "quantity" : 10, "note" : "quantity = 10" } }
}
)
Run Code Online (Sandbox Code Playgroud)
当索引未知且文档应该具有相同键的子文档(如"输入")时,这非常有用更新mongodb中子数组的子元素
| 归档时间: |
|
| 查看次数: |
10828 次 |
| 最近记录: |