Mongodb:从子阵列添加到与条件匹配的字段

时间:2014-07-17 19:26:27

标签: mongodb mongodb-query

我有一个数据库,其中的文档具有以下结构

{
    "word": "apple",
    "pairs": [ [12, 2], [1, 3], [2, 11] ]
}

所以pair是一个包含2个元素的数组。我有一对新的,让我们说my_pair:[5,11]。我想查询单词apple,如果存在,则修改对数组,如下所示:

如果成对配对[1] == my_pair [1]

pair[0] += my_pair[0]
else
push my_pair in pairs`

因此,对于特定示例,文档将如下所示:

{
    "word": "apple",
    "pairs": [ [12, 2], [1, 3], [7, 11] ]
}

我使用pymongo,但我想从查询中执行此操作,而不是在python代码中执行此操作,因为这需要在更新之前知道对数组,这将是一个额外的查询。你能告诉我upsert会是什么样子吗?

1 个答案:

答案 0 :(得分:1)

嵌套数组更新可能是MongoDB的一个问题,但这是可以的,因为您只需要知道"外部"的位置索引。要匹配的数组元素,并且您知道要更新的索引的位置,或者通过$inc递增。

匹配部分通过$elemMatch完成,并使用"点符号" MongoDB和positional $运算符使用的表单:

db.collection.update(
    { "word": "apple", "pairs": { "$elemMatch": { "1": 11 } } },
    { "$inc": { "pairs.$.0": 5 } }
)

这样就会匹配一个内部数组元素,它具有" 11"在第二个或" 1"数组位置,并在第一个或第三个匹配元素的位置递增;" 0"阵列位置。

当然,你的结果是:

{ 
    "word" : "apple",
    "pairs" : [ [ 12, 2 ], [ 1, 3 ], [ 7, 11 ] ]
}