更新mongodb中子数组子中的元素

时间:2012-09-27 00:57:17

标签: mongodb multidimensional-array

我在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" }
            ]
        }
    ]
}

现在我想更新" Svc 1":

的数量
{ "quantity" : 10, "note" : "quantity = 10" }

像:

{"quantity": 100, "note": "changed to 100"}

我如何处理Mongo?

据我所知,操作运算符只支持第一个数组,有人建议使用子子数组元素的索引,但问题是如何在运行时知道该索引? (我使用的是MongoDB的原生C#驱动程序)

提前感谢您的帮助!

约翰尼

2 个答案:

答案 0 :(得分:10)

由于数组中有数组,除非您知道要更新的数组中的位置,否则没有任何简单的方法可以引用嵌套的子数组。

因此,例如,您可以使用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'
        }
    }
)

如果您不知道嵌套input数组的位置,则必须获取匹配的services,在应用程序代码中迭代input数组,然后{{ 1}}更新的数组。

或者,您可以修改嵌套数组以使用嵌入式文档,例如:

$set

然后您可以按名称更新,例如{ "categoryName" : "Cat 1", "services" : [ { "serviceName" : "Svc 1", "input1" : { "quantity" : 10, "note" : "quantity = 10" }, "input2" : { "quantity" : 20, "note" : "quantity = 20" } }, ] }

input1

答案 1 :(得分:5)

由于您不知道要更新的值的位置,因此首先插入包含更新信息的新值,然后删除要更新的值。

db.services.update(
   {
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
    'services.serviceName' : 'Svc 1'
   },
   {
    { $addToSet: { 'services.$.input' : "new sub-Doc" }
   }
)

然后在插入成功时删除

db.services.update(
   {
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
    'services.serviceName' : 'Svc 1'
   },
   {
    { $pull: { 'services.$.input' : { "quantity" : 10, "note" : "quantity = 10" } }
   }
)

当索引未知且文档应具有与帖子Update an element in sub of sub array in mongodb中的“输入”相同的键的子文档时,这很有用