MongoDB - 如果文档不存在则创建,否则将值推入数组

16

我有一个如下形式的文档:

{
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
"events" : [
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 20,
                "data" : "....."
        }
        ...
   ]
 }

我想要一些类似于upsert的语句。如果已经存在该doc,则需要将event添加到user_idevents数组中;否则,它需要创建带有event项的doc

这个能做到吗?

1个回答

30

你可以在Mongo中进行upsert操作,参见Mongo文档中的“使用修改器进行upsert”:

在upsert操作中,你可以使用修改器。在这种情况下,修改器将应用于更新条件成员,并且将插入生成的对象。

你需要的查询语句如下:

db.events.update( { "user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0" }, 
{ $push : { "events" : { "profile" : 10, "data" : "X"}}}, {"upsert" : true});

1
也许我使用的是不同的版本,但仅将 true 作为最后一个更新参数是无效的。我必须将 {upsert: true} 作为参数传入。 - Artur Carvalho
2
@Javier Ferrero的示例仅显示$push,如果像user_id之后还有像user_type这样的字段也需要更新怎么办? - Kanagavelu Sugumar
2
@KanagaveluSugumar,然后组合:{ $set: {...}, $push: {...} } - Dan Oak
3
请使用$addToSet而不是$push。您可能不希望有重复的元素。 - Mike
对于使用pymongo的人来说,应该使用upsert=True命名参数风格而不是json风格。 - Doctor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接