6

我正在使用 Mongoskin + NodeJS 向 MongoDB 添加新关键字。我想通知用户该条目是重复的,但不确定如何执行此操作。

/*
* POST to addkeyword.
*/
router.post('/addkeyword', function(req, res) {
var db = req.db;
db.collection('users').update({email:"useremail@gmail.com"}, {'$addToSet': req.body }, function(err, result) {
    if (err) throw err;
    if (!err) console.log('addToSet Keyword.' );
}); 
});

结果似乎没有任何用处,因为它没有说明是否添加了关键字。

4

3 回答 3

4

至少在 shell 中,您可以区分文档是否被修改(请参阅 参考资料nModified)。

> db.test4.update({_id:2}, {$addToSet: {tags: "xyz" }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.test4.update({_id:2}, {$addToSet: {tags: "xyz" }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

节点更新

使用时,collection.update(criteria, update[[, options], callback]);您可以检索已修改的记录数。

从节点文档

callback是记录更新后要运行的回调。有两个参数,第一个是错误对象(如果发生错误),第二个是被修改的记录数

另一个更新

至少在 1.4.3 版本中,本机 Mongo Node 驱动程序的行为似乎与记录不符。可以使用批量 API(在 Mongo 2.6 中引入)来解决:

var col = db.collection('test');
// Initialize the Ordered Batch
var batch = col.initializeOrderedBulkOp();
batch.find({a: 2}).upsert().updateOne({"$addToSet": {"tags": "newTag"}});
// Execute the operations
batch.execute(function(err, result) {
  if (err) throw err;
  console.log("nUpserted: ", result.nUpserted); 
  console.log("nInserted: ", result.nInserted); 
  console.log("nModified: ", result.nModified); // <- will tell if a value was added or not
  db.close();
});
于 2014-05-08T14:28:14.547 回答
1

你可以使用db.users.findAndModify({email:"useremail@gmail.com"},[],{'$addToSet': { bodies: req.body }},{'new':false}). 注意 new:false 切换器,它允许您在更新之前获取文档,并且您可以在更新之前检查数组是否包含项目。但是,如果您的文档很大,这可能是有问题的方法,因为您在客户端对其进行分析。

PS 您使用 $addToSet 的原始查询是错误的:缺少字段名称。

编辑:我尝试使用返回的计数update,但在所有情况下它都为我返回 1。这是我用于测试 MongoDB 2.6 的代码:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/mtest', function(err, db) {
   if(err) throw err;

   db.collection('test').insert({_id:1,bodies:["test"]},function(err,item){

     db.collection('test').update({_id:1},{$addToSet:{bodies:"test"}}, function(err,affected){
        if(err) throw err;
        console.log(affected); //1 in console

    });
 });

});
于 2014-05-08T14:23:43.690 回答
0

我正在使用这个 JSON 从 Collection 更新一个数组:

{
    "<arrayname>":"<value>"
}

路由.js

routes.post("/api/:id", Controller.addOne);

控制器.js

async addOne(req, res) {
    //juryman id to list add
    if (Object.keys(req.body).length === 1) {
      console.log("Size 1");
    }
    await Session.findOneAndUpdate(
      { _id: req.params.id },
      { $addToSet: req.body }
    )
      .then(function(success) {
        res.send("Successfully saved.");
      })
      .catch(function(error) {
        res.status(404).send(error);
      });
  },

我的 Collection 中有五个数组,这会更改 JSON 数组名称-值并正确更新,分别是 Collection 数组。这仅适用于一项。

于 2020-02-27T21:12:09.190 回答