工作中临时使用到,网上找了许多资料,按例传参一直报错,无奈看了下原码,这里记录下:
mongodb version:2.6.1
nodejs mongodb version:1.4.39
以下为相应源码
var findAndModify = function findAndModify (query, sort, doc, options, callback) {
var args = Array.prototype.slice.call(arguments, 1);
callback = args.pop();
sort = args.length ? args.shift() || [] : [];
doc = args.length ? args.shift() : null;
options = args.length ? args.shift() || {} : {};
var self = this;
var queryObject = {
'findandmodify': this.collectionName
, 'query': query
};
sort = utils.formattedOrderClause(sort);
if (sort) {
queryObject.sort = sort;
}
queryObject.new = options.new ? 1 : 0;
queryObject.remove = options.remove ? 1 : 0;
queryObject.upsert = options.upsert ? 1 : 0;
if (options.fields) {
queryObject.fields = options.fields;
}
if (doc && !options.remove) {
queryObject.update = doc;
}
// Checkout a write connection
options.connection = self.db.serverConfig.checkoutWriter();
if(options.connection instanceof Error && options.connection.code == -5000) return callback(options.connection);
// Either use override on the function, or go back to default on either the collection
// level or db
if(options['serializeFunctions'] != null) {
options['serializeFunctions'] = options['serializeFunctions'];
} else {
options['serializeFunctions'] = this.serializeFunctions;
}
// No check on the documents
options.checkKeys = false;
// Execute the command
this.db.command(queryObject
, options, function(err, result) {
if(err) return callback(err, null);
return callback(null, result.value, result);
});
}