Nodejs中mongosking的findAndModify方法使用问题

Nodejs中mongosking的findAndModify方法使用问题

db.mycollection.findAndModify(
{“sweepAt”: {"$gt": lastSweepAt}, “status”: “none”},
{“joinAt”: 1},
{"$set": {“score”: 100}},
{"_id": 0},
callback
);

每次执行这个findAndModify动作的时候callback里总是只查出一条记录,且不是数组,可是我执行这个查询 的时候

db.mycollection.find({"sweepAt": {"$gt": lastSweepAt}, "status": "none"}).toArray(callback);

会找出很多文档,这是为什么呀!!我用的是mongoskin


5 回复

在 Node.js 中使用 mongoskin 库时遇到 findAndModify 方法返回单个文档而不是多个文档的问题,这是因为 findAndModify 方法的设计初衷就是修改并返回单个匹配的文档。如果你需要找到并处理多个文档,你应该使用其他方法来实现。

示例代码及解释

使用 findAndModify 查找并修改单个文档

var skin = require('mongoskin').db('mongodb://localhost/test');
var collection = skin.collection('mycollection');

var query = { "sweepAt": { "$gt": lastSweepAt }, "status": "none" };
var sort = { "joinAt": 1 };
var update = { "$set": { "score": 100 } };
var options = { "new": true, "_id": 0 };

collection.findAndModify(query, sort, update, options, function(err, doc) {
    if (err) return console.error(err);
    console.log(doc); // 这里只会打印出一个文档
});

在这个例子中,findAndModify 方法会查找并修改第一个匹配的文档,并将修改后的结果作为回调函数的第一个参数返回。

查找多个文档并分别处理

如果你需要查找多个文档并分别处理它们,你可以先使用 find 方法找到所有符合条件的文档,然后对每个文档进行操作:

var skin = require('mongoskin').db('mongodb://localhost/test');
var collection = skin.collection('mycollection');

var query = { "sweepAt": { "$gt": lastSweepAt }, "status": "none" };

collection.find(query).toArray(function(err, docs) {
    if (err) return console.error(err);
    
    docs.forEach(function(doc) {
        var updateQuery = { "_id": doc._id };
        var updateData = { "$set": { "score": 100 } };

        collection.update(updateQuery, updateData, function(err, result) {
            if (err) return console.error(err);
            console.log(result); // 打印更新的结果
        });
    });
});

在这个例子中,我们首先使用 find 方法找到所有符合条件的文档,然后对每个文档使用 update 方法进行更新。这样可以确保每个符合条件的文档都被单独处理。

总结

findAndModify 方法主要用于查找并修改单个文档,而如果你想查找并处理多个文档,则应该使用 findupdate 方法结合的方式来实现。希望这些示例代码能够帮助你更好地理解和解决你的问题。


db.mycollection.findAndModify(
		{},
		{},
		{"$set": {"sweepAt": time}},
		callback
	);

甚至我这样无条件的查找,出只给我返回一条记录了,这是为啥呀?我的mycollection中可不止一条!

好吧,其实mongodb的runcommand findAndModify也只最多找出一个!!OMG!! 我知道!

不知道mongooskin提供了多行修改的api没,mongoose是提供了的

在使用 mongoskinfindAndModify 方法时,它默认只会返回匹配到的第一条文档。这是因为 findAndModify 方法在修改文档的同时返回一个文档对象,而不是一个数组。如果你希望返回所有匹配的文档,则需要调整你的查询逻辑。

示例代码

假设你想修改所有符合条件的文档,并获取这些修改后的文档列表,可以这样做:

var db = require('mongoskin').db('localhost:27017/mydb', {safe:true});

function updateDocuments(lastSweepAt, callback) {
    var query = {"sweepAt": {"$gt": lastSweepAt}, "status": "none"};
    var sort = {"joinAt": 1}; // 按joinAt排序
    var update = {"$set": {"score": 100}};
    var options = {"new": true}; // 返回更新后的文档

    db.collection('mycollection').findAndModify(query, sort, update, options, function(err, doc) {
        if (err) {
            return callback(err);
        }

        // 如果只想返回一条记录,可以直接返回doc
        // 如果想返回所有匹配的文档,需要调用多次findAndModify或使用其他方法
        callback(null, doc);
    });
}

// 调用函数
updateDocuments(new Date(), function(err, updatedDoc) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(updatedDoc);
});

解释

  • findAndModify 方法用于查找并修改文档。
  • query 定义了要查找的条件。
  • sort 参数用于定义返回文档的排序规则。
  • update 定义了要对文档进行的修改操作。
  • options 中的 "new": true 表示返回更新后的文档,而不是原始文档。

注意事项

  1. 返回单个文档findAndModify 默认只会返回一个文档。如果你想处理多个文档,可能需要考虑使用循环或其他方法来多次调用 findAndModify
  2. 替代方案:如果需要处理多个文档,可以先使用 find 查询所有文档,然后逐个调用 findAndModify 更新每个文档。

希望这个解释对你有所帮助!

回到顶部