我有一个数据库,其中的文档具有以下结构
{
"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会是什么样子吗?
答案 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 ] ]
}