Node.js 如何检查Mongo';s$addToSet是否重复

Node.js 如何检查Mongo';s$addToSet是否重复,node.js,mongodb,mongoskin,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

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

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

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

注意:您使用$addToSet的原始查询错误:缺少字段名

Edit:我试图使用
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

    });
 });

});

至少在shell中,您可以区分文档是否已修改(请参见
nModified

节点更新

当您使用
collection.update(条件,update[],options],callback])您可以检索已修改记录的计数

从节点

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

另一次更新

至少在版本1.4.3中,本机Mongo节点驱动程序的行为似乎与文档中的不同。可以使用批量API(在Mongo 2.6中引入)解决以下问题:

var col=db.collection('test');
//初始化已订购的批处理
var batch=col.initializeOrderedBulkOp();
batch.find({a:2}).upsert().updateOne({“$addToSet”:{“tags”:“newTag”});
//执行操作
批处理执行(函数(错误、结果){
如果(错误)抛出错误;
log(“nUpserted:,result.nUpserted”);
日志(“未插入:,结果未插入”);

console.log(“nModified:,result.nModified);//我正在使用此JSON更新集合中的数组:

{
    "<arrayname>":"<value>"
}
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数组名称值并正确更新相应的集合数组。这仅适用于一个项目。

值得注意的是,这是一个新功能,在2.6之前,它将记录修改过的内容,即使它没有。您确定它可以按照MongoDb 2.6的描述工作吗?我刚刚尝试过,但它重新运行了在这种情况下,在回调中返回了1。因此,它似乎返回了匹配的计数,但不是修改的计数。我在Windows上使用MongoDB 2.6.0。@AndreiBeziazychnyi您使用的是最新的驱动程序吗?很可能是w API更改需要驱动程序更改。我在检查之前更新了驱动程序,最新版本是1.4.3。您能否确认所述方法适用于你在node.js中吗?
{
    "<arrayname>":"<value>"
}
routes.post("/api/:id", Controller.addOne);
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);
      });
  },