如何检查Mongo的$ addToSet是否重复

时间:2014-05-08 14:14:59

标签: node.js mongodb mongoskin

我使用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.' );
}); 
});

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

3 个答案:

答案 0 :(得分: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]);时,您可以检索已修改的记录数。

来自节点docs

  

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

另一次更新

至少在版本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();
});

答案 1 :(得分:1)

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

P.S。使用$ 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

    });
 });

});

答案 2 :(得分:0)

我正在使用以下JSON更新Collection中的数组:

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

route.js

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

Controller.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);
      });
  },

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