MongoDB initializeOrderedBulkOp():仅当find()返回null时才更新(推送到数组)

时间:2017-08-22 06:50:53

标签: mongodb bulk-operations

我在mongodb中使用批量操作。我有一种情况,如果不满足条件,我需要将对象推入数组字段。

如果configs中没有匹配itypeprefix的项目,那么它应该将对象推送到configs。我怎么能这样做?

//! Find and push if document found but item does not exist.
            orderedBulkOP.find({
              "cid": newConfig.cid,
              "username": newConfig.username,
              "configs": {
                $elemMatch: {
                  "itype": newConfig.itype, "prefix": newConfig.prefix
                }
              }
            }).update({
              $push: {
                "configs": {
                  "itype": newConfig.itype,
                  "prefix": newConfig.prefix,
                  "count": 0,
                  "createdAt": new Date().toISOString()
                }
              }
            });

架构是这样的:

{
  id: String,
  uniqid: String,
  cid: String,
  username: String,
  configs: [{
    createdAt: Date,
    itype: String,
    prefix: String,
    count: Number
  }
  ]
}

1 个答案:

答案 0 :(得分:0)

  

如果配置中没有匹配itype和前缀的项目,   然后它应该将对象推入配置

您可能在这里寻找upsert操作。

您可以尝试将查询更新为:

orderedBulkOP.find({
          "cid": newConfig.cid,
          "username": newConfig.username,
          "configs": {
            $elemMatch: {
              "itype": newConfig.itype, "prefix": newConfig.prefix
            }
          }
        }).upsert().update({
          $push: {
            "configs": {
              "itype": newConfig.itype,
              "prefix": newConfig.prefix,
              "count": 0,
              "createdAt": new Date().toISOString()
            }
          }
        });
  

如果没有匹配的文档,则将upsert选项设置为true   Bulk.find()条件,然后更新或替换   操作执行插入。

如果用例仅在未找到具有组合的文档时插入,否则不执行任何操作。然后,您可以在update中使用setOnInsert,有点像:

update({
     "$setOnInsert": {
        "configs": {
          "itype": newConfig.itype,
          "prefix": newConfig.prefix
        }
      }
    });
  

如果使用upsert: true的更新操作生成insert文档,则$setOnInsert会将指定的值分配给文档中的字段。

     

如果插入中的更新操作未导致,则$setOnInsert不执行任何操作。