我使用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.' );
});
});
结果似乎没有任何用处,因为它没有告诉我是否添加了关键字。
答案 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的数组。这仅适用于一项。