我正在寻找一种将代码的一部分重构为更短,更简单的方法,但是我对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;
}
});
}
});
您正在寻找new
option参数。该new
选项返回新创建的文档(如果创建了新文档)。像这样使用它:
var query = {},
update = { expire: new Date() },
options = { upsert: true, new: true, setDefaultsOnInsert: true };
// Find the document
Model.findOneAndUpdate(query, update, options, function(error, result) {
if (error) return;
// do something with the document
});
由于upsert
创建文档(如果找不到文档),因此您无需手动创建另一个文档。
问题内容: 我试图在 POSTGRES中 编写一个复杂的查询,这个问题是该子查询。 这是我的表(id是主键和自动递增): 在此表中,我想获取id为“ xyz”且appid = 2的id,如果不存在,则插入并返回ID。 我知道有几个类似的问题,有些问的有些相同,我已经尝试过了,但似乎没有用。 这是我试图起诉的,但未能按预期进行: 当添加新元素并返回新添加元素的ID时,此方法效果很好,但当行已存在时不
问题内容: 我在我的网站上设置了一个滑动面板。 完成动画制作后,我像这样设置哈希 (这是一个回调,并且在前面已分配)。 这很好用,可以使用户在面板上添加书签,也可以使非JavaScript版本正常工作。 但是,当我更新哈希时,浏览器跳到该位置。我想这是预期的行为。 我的问题是:如何预防这种情况?即如何更改窗口的哈希值,但是如果哈希值存在,浏览器 不能 滚动到该元素?某种东西吗? 我正在使用jQue
问题内容: 当我使用猫鼬时,我发现了两种在nodejs中创建新文档的方法。 首先 : 第二 有什么区别吗? 问题答案: 是的,主要区别在于您可以在保存之前进行计算,也可以对构建新模型时出现的信息做出反应。最常见的示例是在尝试保存模型之前确保模型有效。其他一些示例可能是在保存之前创建任何缺失的关系,需要基于其他属性即时计算的值以及需要存在但可能永远不会保存到数据库(异常交易)的模型。 因此,作为您可
我知道在最新版本的Mongoose中,您可以将多个文档传递给create方法,在我的例子中,甚至可以传递一个文档数组。 我的问题是数组的大小是动态的,所以在回调中创建一个对象数组会很有帮助。 文档中没有,但这样做可能吗?
我想像这样更新文档: 但是,如果doc user\u id不存在,上述代码将抛出错误。因此,如果不存在,如何告诉Firestore创建学生,换句话说,行为如下:
本文向大家介绍如何在不覆盖现有文档的情况下更新MongoDB文档?,包括了如何在不覆盖现有文档的情况下更新MongoDB文档?的使用技巧和注意事项,需要的朋友参考一下 要仅更新字段值,请使用update()和$set。这不会覆盖现有的。首先让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新文档而不覆盖现有文档的查询- 在find()方法