【问题标题】:mongodb - create doc if not exist, else push to arraymongodb - 如果不存在则创建文档,否则推送到数组
【发布时间】:2011-01-23 16:16:50
【问题描述】:

我有一份格式如下的文件:

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

我想要某种upsert 声明。如果已经存在这样的文档,则需要将event添加到user_idevents数组中,否则需要使用event项创建文档。

可以吗?

【问题讨论】:

    标签: arrays mongodb upsert


    【解决方案1】:

    您可以在 Mongo 中进行 upserts,请参阅 Mongo doc 中的“带修饰符的 Upserts”:

    你可以使用带有修饰符的 upsert 手术。在这种情况下, 修饰符将应用于 更新标准成员和 结果对象将被插入。

    您需要的查询将如下所示:

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

    【讨论】:

    • 也许我使用的是不同的版本,但只有 true 作为最后一个更新参数它不起作用。我不得不把 {upsert: true} 作为论据。
    • @Javier Ferrero Example 只显示了 $push,如果在 user_id 之后还有 user_type 之类的字段也必须更新..?
    • @KanagaveluSugumar,然后合并:{ $set: {...}, $push: {...} }
    • 注意 - 使用 $addToSet 而不是 $push。您可能不想要重复的元素。
    • 对于使用 pymongo 的人,它的 upsert=True 命名为 param 样式而不是 json 样式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2017-05-10
    • 2021-09-13
    相关资源
    最近更新 更多