首页 > 解决方案 > 对空数组使用 $push

问题描述

我有一个 mongo 文档,其中包含名为“events”的数组字段。

该字段有时可以为空。

我正在使用$push将元素添加到“事件”数组。问题是,当“事件”字段为空时它不能工作

例如,如果在数据库中,它看起来像这样:

{
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
"events" : null
 }

我用 $push 运行更新:

{ $push : { "events" : { "profile" : 10, "data" : "X"}}};

它将失败,因为事件为空。

我可以使用 2 个查询数据库的步骤来解决这个问题。但是,我可以在 1 个查询中完成吗?

如果数组字段不为空,我想将事件添加到数组中,但如果为空,则首先创建“事件”空数组,然后将事件添加到数组中。

标签: mongodb

解决方案


从 MogoDB 4.2 开始,您可以使用Updates with Aggregation Pipeline。这允许将更新作为单个操作执行。

var OBJ_TO_ADD = { "profile": 10, "data": "X" }

db.test.updateOne(
  { "_id" : ObjectId("4d2d8deff4e6c1d71fc29a07") }, 
  [ 
      { 
          $set: { 
              events: { 
                  $ifNull: [ 
                      { $concatArrays: [ "$events", [ OBJ_TO_ADD ] ] }, 
                      [ OBJ_TO_ADD ] 
                  ] 
              }
          }
      } 
  ] 
)

推荐阅读