最佳答案
我正在寻找一种方法来重构我的部分代码,使之更短更简单,但是我不太了解 Mongoose,也不知道如何继续。
我试图检查一个集合是否存在一个文档,如果它不存在,就创建它。如果它真的存在,我需要更新它。在这两种情况下,我都需要在事后访问文档的内容。
到目前为止,我所做的就是查询特定文档的集合,如果找不到,就创建一个新文档。如果找到了,我会更新它(目前使用日期作为虚拟数据)。从那里,我可以访问找到的文档从我最初的 find
操作或新保存的文档和这个工作,但必须有一个更好的方式来完成我所追求的。
这是我的工作代码,没有分心的临时演员。
var query = Model.find({
/* query */
}).lean().limit(1);
// Find the document
query.exec(function(error, result) {
if (error) { throw error; }
// If the document doesn't exist
if (!result.length) {
// Create a new one
var model = new Model(); //use the defaults in the schema
model.save(function(error) {
if (error) { throw error; }
// do something with the document here
});
}
// If the document does exist
else {
// Update it
var query = { /* query */ },
update = {},
options = {};
Model.update(query, update, options, function(error) {
if (error) { throw error; }
// do the same something with the document here
// in this case, using result[0] from the topmost query
});
}
});
我已经研究了 findOneAndUpdate
和其他相关的方法,但是我不确定它们是否适合我的用例,或者我是否理解如何正确地使用它们。有人能告诉我正确的方向吗?
(可能)相关问题:
在我的搜索过程中,我并没有遇到这个问题,但是在回顾了这些问题的答案之后,我得出了这个结论。在我看来,它当然更漂亮,而且很有效,所以除非我做了什么可怕的错事,否则我想我的问题可能就到此为止了。
如果您能对我的解决方案提供更多的意见,我将不胜感激。
// Setup stuff
var query = { /* query */ },
update = { expire: new Date() },
options = { upsert: true };
// Find the document
Model.findOneAndUpdate(query, update, options, function(error, result) {
if (!error) {
// If the document doesn't exist
if (!result) {
// Create it
result = new Model();
}
// Save the document
result.save(function(error) {
if (!error) {
// Do something with the document
} else {
throw error;
}
});
}
});