我有一个包含项目的数据库,每个项目都有一系列链接。添加链接时我的express.js代码是这样的:
router.get('/links/add', function(req, res){
Project.findOneAndUpdate(
{_id: req.query.pid},
{$addToSet: {links: {url: req.query.url , title: req.query.title} }},
{safe: true, upsert: true, new:true},
function(err, project) {
if(err) {
//do stuff
} else {
//Something was added to set!
}
}
);
});
它工作得很好并且不会添加重复项,但我需要知道什么时候实际更新了什么。现在,你可以看到我已经启用了返回新文档的new:true
选项,所以我可以删除它并查看旧版本中是否存在该链接,但有没有办法在启用该标志的情况下执行此操作?
这似乎是一个基本功能,但我在文档中找不到任何内容。
答案 0 :(得分:0)
由于您要添加一个集合,我们将找到该集合,然后检查我们的更新值是否在集合中。如果是,我们可以结束该功能,否则我们可以更新,同时保持对更新内容的了解。 (这是要点,因为我自己无法测试,可能会有一两个错误。)
router.get('/links/add', function(req, res){
var updating = false;
Project.find({_id: req.query.pid}, function(err, project) {
if(err) {
// handle error
} else {
// Check if found project contains what we mean to update.
// If it does already (nothing is changing) leave updating as false
// and we exit.
// Otherwise keep reference to what is being updated, set updating to
// true, and after we finish updating you have reference to what changed
}
}
if(updating) {
Project.findOneAndUpdate(
{_id: req.query.pid},
{$addToSet: {links: {url: req.query.url , title: req.query.title} }},
{safe: true, upsert: true, new:true},
function(err, project) {
if(err) {
//do stuff
} else {
//Something was added to set!
}
}
);
}
});