1

我在 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
  }
  ]
}
4

1 回答 1

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() 条件不存在匹配的文档,则更新或替换操作将执行插入。


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

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

如果更新操作upsert: true导致insert文档的 an,则将$setOnInsert指定的值分配给文档中的字段。

如果更新操作没有导致插入,$setOnInsert则什么也不做。

于 2017-08-22T07:07:48.387 回答