Mongoose 是否支持 Mongodb `findAndModify` 方法?
我想使用 Mongoose 使用 findAndModify 以原子方式增加字段。
但是,下面的代码会抛出错误“TypeError: Object # has no method 'findAndModify'”:
// defining schema for the "counters" table
var tableSchema = new Schema({
_id: String,
next: Number
});
// creating table object for the counters table
var counters_table = mongoose.model('counters', tableSchema);
var tableObj = new counters_table();
// increment the "next" field on the table object
var query = {_id: 'messagetransaction'};
var update = {'$inc': {next: 1}};
var ret = tableObj.findAndModify(query, [], update, true, true, function(err) {
if (err) {
throw err;
}
else {
console.log("updated!");
}
});
I would like to use findAndModify to atomically increment a field, using Mongoose.
However, the code below throws the error "TypeError: Object # has no method 'findAndModify'":
// defining schema for the "counters" table
var tableSchema = new Schema({
_id: String,
next: Number
});
// creating table object for the counters table
var counters_table = mongoose.model('counters', tableSchema);
var tableObj = new counters_table();
// increment the "next" field on the table object
var query = {_id: 'messagetransaction'};
var update = {'$inc': {next: 1}};
var ret = tableObj.findAndModify(query, [], update, true, true, function(err) {
if (err) {
throw err;
}
else {
console.log("updated!");
}
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
该功能没有得到很好的记录(阅读:根本没有),但是在阅读了源代码之后,我想出了以下解决方案。
创建您的集合架构。
在架构上创建一个静态方法,该方法将公开模型集合的 findAndModify 方法。
创建您的模型。
查找并修改!
奖励
The feature is not well (read: at all) documented, but after reading through the source code, I came up with the following solution.
Create your collection schema.
Create a static method on the schema which will expose the findAndModify method of the model's collection.
Create your model.
Find and modify!
Bonus
Mongoose 3.x 现在完全支持这一点,尽管名称略有不同。
http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate
http://mongoosejs.com/docs/api.html#model_Model.findOneAndRemove
http://mongoosejs.com/docs/api.html#model_Model.findByIdAndRemove
This is fully supported in Mongoose 3.x now, though the name is slightly different.
http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate
http://mongoosejs.com/docs/api.html#model_Model.findOneAndRemove
http://mongoosejs.com/docs/api.html#model_Model.findByIdAndRemove
为 Mongoose 3.x 增加了工作版本
使用类似这样的内容:
我希望有人能派上用场
Made working version increment for Mongoose 3.x
Use something like this:
I hope someone come in handy
在版本3中,mongoose findOneAndUpdate方法公开了mongodb的findAndModify操作。它的工作原理如下:
更多信息在这里:http://aaronheckmann。 tumblr.com/post/48943524629/mongoose-v3-part-2-findandmodify
In version 3, the mongoose findOneAndUpdate method exposes mongodb's findAndModify operation. It works like so:
More info here: http://aaronheckmann.tumblr.com/post/48943524629/mongoose-v3-part-2-findandmodify
有很多答案,但我找到了这个简单的解决方案。
a lot of answers but I find this simple solution.
我让 findAndModify
使用以下代码在单个数据库往返中调用
:享受!
- 柯兰
I got findAndModify to
in a single DB roundtrip using the following code:
Enjoy!
- Curran
根据 @furf 的上述回复,这是我的
承诺的
解决方案:Taking the above response from @furf, this is my
promised
solution:我建议使用 http://www.mongodb 底部显示的直接命令样式。 org/display/DOCS/findAndModify+Command。我对 mongoose 不太熟悉,不知道运行命令的方法,但所有驱动程序都提供了一些方法来执行此操作。如果 mongoose 没有,您可以直接使用 http:// 顶部描述的样式来完成www.mongodb.org/display/DOCS/Commands。
也就是说,您应该确保您确实需要
findAndModify
并且update
不会执行您需要它执行的操作。要了解update
的功能,请查看 http://www .mongodb.org/display/DOCS/Updating。I would suggest using the direct command style shown at the bottom of http://www.mongodb.org/display/DOCS/findAndModify+Command. I'm not familiar enough with mongoose to know the method for running a command, but all drivers provide some way to do it. If mongoose doesn't, you can do it directly using the style described at the top of http://www.mongodb.org/display/DOCS/Commands.
That said, you should make sure that you really need
findAndModify
and thatupdate
won't do what you need it to do. To see whatupdate
is capable of take a look at http://www.mongodb.org/display/DOCS/Updating.只是添加到furf答案中,如果您在查询中使用objectId,mongoDB将无法找到您的文档。猫鼬层负责将从路由参数获得的十六进制字符串对象 ID 转换为正确的对象 ID。
要解决这个问题,您需要:
just adding to furf answer that if you use objectId in your query, mongoDB will not be able to find your document. The mongoose layer takes care of converting the Hex string object id you get from the routing params to the proper object id.
to solve this you need to: