是否可以执行一个MongoDB查询,该查询会increment
嵌套文档的字段,并在文档不存在时创建该嵌套文档?
示例:
{
id: ...
nestedArray: [
{kind: "foo", times: 10}
]
}
假设我想增加一个nestedArray.$.times
字段kind: "bar"
,但数组中不存在bar
?因此在执行看起来像
db.mycollection.update({id: "100", nestedArray:{$elemMatch: {kind: "bar"}}}, {$inc: {'nestedArray.$.times': 1}}, {upsert: true})
文件看起来像这样:
{
id: ...
nestedArray: [
{kind: "foo", times: 10},
{kind: "bar", times: 1}
]
}
当然,如果找不到整个文档(不仅仅是嵌套文档),那么会自动创建一个文档。
答案 0 :(得分:1)
作为一种解决方法,可以通过两个更新查询来实现,
<强>查询1 强>
db.mycollection.update(
{id:"400","nestedArray.kind": "bar"},
{$inc: {"nestedArray.$.times":1}}
)
这是一个直接的查询,它增加了nestedArray.kind的nestedArray.times值为“bar”。如果找不到该文档则无效。
查询2
此查询处理插入新文档/推入嵌套数组,以防id存在匹配文档。
db.mycollection.update(
{id:"400","nestedArray.kind": {$ne:"bar"}},
{$push: {"nestedArray": {kind:"bar","times":1}}},
{upsert:true}
)
此查询在文档中搜索id,其中nestedArray.kind没有条形值。如果找到这样的文档,{kind:"bar","times":1}
将被推送到nestedArray。如果未找到,则会创建一个新文档,其中{kind:"bar","times":1}
是nestedArray中的唯一值。