我正在尝试在node.js应用程序的mongodb中插入数据。但是我的要求是每次在文档中创建新文章。

0:Object
_v:0
_id:"56e1825c9d7b67156d2f38b2"
actor:"FirstActor"
productName:"Kernal"

1:Object
_v:0
_id:"56e1832a9c363cd405d980ee"
actor:"SecondActor"
productName:"Kernal"


我的代码每次都创建一个具有唯一ID的新对象。我想要的是这样的:

0:Object
_v:0
_id:"56e1825c9d7b67156d2f38b2"
actor:{"FirstActor","Second Actor"}
productName:"Kernal"


如果productName相同,则不应创建新对象。

我写的代码看起来像:

  app.post('/addActor',function(req, res) {

        console.log("Calling to Adding Actor");
        console.log(req.body);
        impactMap.create({

            productName : req.body.productName,
            actor : req.body.actor,

            /*done : false*/
        }, function(err, data) {
            if (err)
                res.send(err);

            // get and return all the todos after you create another
            impactMap.find(function(err, data) {
                if (err)
                    res.send(err)
                res.json(data);
            });
        });

    });

最佳答案

每次都会创建一个新对象,因为每次都调用create。您要查找的是upsert

impactMap.updateOne(
  { productName: req.body.productName },
  { $push: { actor: req.body.actor } },
  { upsert: true }
}, function (err, data) {
  // callback code can stay the same
});


这可能不适用于现有文档,因为您似乎不是用actor作为数组创建它们的。您将需要像这样更新模型:

mongoose.model('impactMap', {
  ...
  actor: [{ type: 'string' }],
  ...
});

09-12 20:32