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();

解释

  1. 定义 Schema 和 Model:

    • 创建一个简单的 Schema,包含一个名为 amount 的字段。
    • 使用 mongoose.model 将 Schema 转换为 Model。
  2. 扩展静态方法:

    • 在 Schema 上定义一个静态方法 findAndModify,该方法调用底层 MongoDB 集合的 findAndModify 方法。
  3. 调用 findAndModify 并处理结果:

    • 使用 await 等待异步操作完成,并在回调函数中访问修改后的文档。
    • options.new: true 参数确保返回的是更新后的文档。
    • 通过回调函数中的 doc.value.amount 可以直接访问到更新后的 amount 值。

这样,你就可以在回调函数中直接获取到更新后的文档,从而获得新的 amount 值。

回到顶部