Mongoose:如果对象存在,则增加值,如果没有推入数组

时间:2017-08-02 23:30:08

标签: arrays node.js mongodb mongoose

伙计们,我有以下模型:

articles: [
    {
      _id: {
        type: ObjectId,
        ref: "Article"
      },
      amount: {
        type: Number
      }
    }
  ]

想法是找出数组中是否存在文章,如果是,则增加数量,否则将值推入数组。

目前,我使用以下代码,但我确定只需使用一个 findandupdate 即可。

function(warehouse, article, amount) {
Warehouse.findOne({
  _id: warehouse,
  "articles._id": article
})
  .then(function(found) {
    if (found) {
      return Warehouse.findOneAndUpdate(
        {
          _id: warehouse,
          "articles._id": article
        },
        {
          $inc: { "articles.$.amount": amount }
        }
      );
    }
    return Warehouse.findOneAndUpdate(
      {
        _id: warehouse
      },
      {
        $push: {
          articles: {
            _id: article,
            amount: amount,
            serialized: false
          }
        }
      }
    );
  })

修改

我使用了Neil建议,因为我不需要从此查询返回的文档。

所以这是批量写:

 Warehouse.bulkWrite(
  [
    {
      updateOne: {
        filter: { _id: warehouse, "articles._id": article },
        update: {
          $inc: {
            "articles.$.amount": amount
          }
        }
      }
    },
    {
      updateOne: {
        filter: { _id: warehouse },
        update: {
          $addToSet: {
            articles: {
              _id: article,
              amount: amount,
              serialized: true
            }
          }
        }
      }
    }
  ],

不知何故,第二次更新总是被执行,即使它是$ addToSet。有关如何避免这种行为的任何想法?

1 个答案:

答案 0 :(得分:0)

我使用了Neil Lunn的建议,因为我不需要从此查询中返回的文档。

所以这是批量写:

Warehouse.bulkWrite(
  [
    {
      updateOne: {
        filter: { _id: warehouse, "articles._id": article },
        update: {
          $inc: {
            "articles.$.amount": amount
          }
        }
      }
    },
    {
      updateOne: {
        filter: { _id: warehouse,
                  "articles._id": { $exists: false }},
        update: {
          $addToSet: {
            articles: {
              _id: article,
              amount: amount,
              serialized: true
            }
          }
        }
      }
    }
  ],

不知何故,第二次更新总是被执行,即使它是$ addToSet,这就是我添加过滤器的原因:" articles._id":{$ exists:false}。有关如何避免这种行为的任何想法?