通过一次调用升级到一系列嵌入式文档

时间:2019-02-22 04:04:16

标签: node.js mongodb mongoose

我一直在寻找一种基于嵌入式文档ID来向上插入嵌入式文档的方法。到目前为止,每种方法都需要对DB进行两次单独的调用才能使其正常工作。这是一个示例文档(sku包含更多信息,但为了简洁起见,我将其保留)。

{
id: 12335,
skus: [{id:239032489230}, {id:kd893dsands}]
}

这是我发现的更好的方法之一,因为如果存在,它不会打第二个电话。有没有办法在一次调用mongodb中做到这一点(如果存在或不存在)?

{id: 12335} //example query
{id:239032489230, name: "Large"} //example sku

  module.exports.upsertSku = function (query, sku) {
    return new Promise((resolve, reject) => {

      Product.findOneAndUpdate(query, {
        $set: {
          "skus.$[elem]": sku
        }
      },
      {
        arrayFilters: [  { "elem.id":  sku.id  } ],
        upsert: true, //does not upsert into the array :(
        new: true
      })
      .exec()
      .then((product) => {
        if (product.skus.some(docSku => docSku.id === sku.id)) { //checks if the id of the object passed exists in the skus array.
          console.log("Sku exists and has been updated.")
          resolve(product)
        }else{
          console.log("Sku does not exist. Adding sku...")
          addSku()
        }
      }).catch((err) => {
        reject(err);
      })

      function addSku() {
        Product.findOneAndUpdate(query, {
          $push: {"skus": sku}
        },
        {new: true})
        .exec()
        .then((product) => {
          resolve(product);
        }).catch((err) => {
          reject(err);
        })
      }

    });
  };

0 个答案:

没有答案