Nodejs mongoose中如何取得findAndModify的返回值?
Nodejs mongoose中如何取得findAndModify的返回值?
SomeSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
return this.collection.findAndModify(query, sort, doc, options, callback);
};
mongoose.model(‘Some’,SomeSchema);
然后findAndModify
Some.findAndModify({}, [], { $inc: { amount: 1 } }, {'new':true}, function (err) {
if (err) throw err;
});
似乎成功的给amount加了1,但是我想直接取得新amount的值,有办法么?
3 回复
在Node.js中使用Mongoose时,findAndModify
方法允许你在数据库中查找、修改并返回文档。然而,Mongoose本身并没有提供一个直接的 findAndModify
方法,因此你通常需要通过访问底层的MongoDB驱动来实现这一功能。
下面是如何使用 findAndModify
并获取修改后的文档的完整示例:
定义模型方法
首先,你需要定义一个静态方法来调用 findAndModify
方法。你可以像下面这样创建一个自定义方法:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 定义你的Schema
const SomeSchema = new Schema({
name: String,
amount: { type: Number, default: 0 }
});
// 添加自定义的findAndModify方法
SomeSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
return this.collection.findOneAndUpdate(query, doc, options, callback);
};
// 创建模型
const Some = mongoose.model('Some', SomeSchema);
// 使用这个模型
调用findAndModify方法
接下来,你可以使用这个自定义的方法来找到并更新文档,并获取修改后的结果:
Some.findAndModify(
{}, // 查询条件
[], // 排序条件
{ $inc: { amount: 1 } }, // 更新操作
{ new: true }, // 选项,设置为{ new: true }以获取修改后的文档
function (err, result) {
if (err) throw err;
console.log(result); // 输出修改后的文档
console.log(result.amount); // 输出新的amount值
}
);
解释
findOneAndUpdate
方法类似于findAndModify
,它接受四个参数:查询条件、更新操作、选项以及回调函数。{ new: true }
选项确保你得到的是更新后的文档,而不是更新前的文档。- 在回调函数中,
result
参数包含了修改后的文档,你可以通过result.amount
来获取更新后的amount
值。
这种方法可以让你方便地获取到更新后的数据,而不仅仅是更新操作的结果。
在 Mongoose 中使用 findAndModify
方法时,可以通过传递一个回调函数来获取修改后的文档。在回调函数中,你可以直接访问到修改后的结果。
示例代码
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 定义 Schema
const SomeSchema = new Schema({
amount: { type: Number, default: 0 }
});
// 扩展静态方法
SomeSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
return this.collection.findAndModify(query, sort, doc, options, callback);
};
const Some = mongoose.model('Some', SomeSchema);
async function updateAmount() {
const query = {}; // 查询条件
const sort = []; // 排序条件
const doc = { $inc: { amount: 1 } }; // 更新操作
const options = { new: true }; // 返回更新后的文档
try {
const result = await Some.findAndModify(query, sort, doc, options, (err, doc) => {
if (err) throw err;
console.log('Updated amount:', doc.value.amount); // 获取更新后的 amount 值
});
console.log('Final document:', result);
} catch (error) {
console.error('Error updating document:', error);
}
}
updateAmount();
解释
-
定义 Schema 和 Model:
- 创建一个简单的 Schema,包含一个名为
amount
的字段。 - 使用
mongoose.model
将 Schema 转换为 Model。
- 创建一个简单的 Schema,包含一个名为
-
扩展静态方法:
- 在 Schema 上定义一个静态方法
findAndModify
,该方法调用底层 MongoDB 集合的findAndModify
方法。
- 在 Schema 上定义一个静态方法
-
调用
findAndModify
并处理结果:- 使用
await
等待异步操作完成,并在回调函数中访问修改后的文档。 options.new: true
参数确保返回的是更新后的文档。- 通过回调函数中的
doc.value.amount
可以直接访问到更新后的amount
值。
- 使用
这样,你就可以在回调函数中直接获取到更新后的文档,从而获得新的 amount
值。