如何在 Mongoose 中使用 Document#update?
Posted
技术标签:
【中文标题】如何在 Mongoose 中使用 Document#update?【英文标题】:How to use Document#update in Mongoose? 【发布时间】:2013-08-23 08:47:03 【问题描述】:我正在这里查看 Mongoose 中 Document#update 的示例:
http://mongoosejs.com/docs/api.html#document_Document-update
方法签名:
Document#update(文档、选项、回调)
示例代码:
weirdCar.update($inc: wheels:1, w: 1 , 回调);
文档说第一个参数应该是“doc”,但 doc 到底是什么?我想 doc 应该只是一个将键映射到要更新的新值的对象(默认情况下使用 $set )。在代码示例中,他们试图将***增加 1。
然后在示例中,他们将 w : 1 作为选项传递,但根据 Model.Update,“w”不是有效选项。唯一有效的选项应该是:safe、upsert、multi、strict。
http://mongoosejs.com/docs/api.html#model_Model.update
谁能解释一下Mongoose提供的示例代码?
【问题讨论】:
【参考方案1】:对我来说,关键是正确的参数。您需要提供 callback
参数或在结果上调用 .exec()
以使其工作。
var Product = mongoose.model('product', mongoose.Schema(
name: String
));
Product.findById('539dceccc61fa4950b43423a', function (err, product)
product.update( name: 'test' , null, function(err, numberAffected, raw) );
//or
product.update( name: 'test' ).exec();
);
【讨论】:
这真的很有帮助。浪费了这么多时间只是因为我忘记了执行部分。【参考方案2】:在我看来,文档是错误的。
此外,有些人不理解这里的问题。我们正在尝试在 DOCUMENT 上致电update
。执行更新时不查询文档。有区别,Mongoose 并没有很好地记录它。
文档是这样说的:关于document.update
例子: weirdCar.update($inc: wheels:1, w: 1 , callback);
参数:
doc <Object>
options <Object>
callback <Function>
有效选项
same as in Model.update
让我们看看 Model.updates 选项...
Model.updates 选项:
安全(布尔)安全模式(默认为架构中设置的值 (true)) upsert (boolean) 如果文档不匹配,是否创建文档 (false) multi (boolean) 是否应该更新多个文档 (false) runValidators:如果为真,则在此命令上运行更新验证器。更新验证器根据模型的架构验证更新操作。 setDefaultsOnInsert:如果 this 和 upsert 为真,如果创建新文档,mongoose 将应用模型架构中指定的默认值。此选项仅适用于 MongoDB >= 2.4,因为它依赖于 MongoDB 的 $setOnInsert 运算符。 strict(布尔值)覆盖此更新的严格选项 overwrite (boolean) 禁用仅更新模式,允许您覆盖 doc (false)那里没有与该示例相对应的内容...没有提及 w : 1
或 w
任何内容...所以是的,看来文档是错误的。
但是,您可以在有或没有这些选项的情况下使用它。
所以看起来像这样没有任何选项
weirdCar.update($inc: wheels:1, function(err, updated)
// 'updated' is the object: ok: number, nModified: number, n: number
)
【讨论】:
有什么方法可以在回调中获取更新的文档?我想在文档中推送一个新对象,并希望在回调中返回相同的对象【参考方案3】:Mongoose api 基于底层的 MongoDB 查询结构。在这种情况下,“doc”指的是匹配您要更新的某些文档的标准。 MongoDB 文档非常清楚地解释了这一点: http://docs.mongodb.org/manual/core/write-operations/#update
因此,假设您有一个“汽车”集合,并且您想查找所有具有 3 个***的文档(所有汽车),并增加该值以使这些汽车具有 4 个***。在这种情况下,“doc”是 wheels:3,它返回集合中的所有三轮汽车。这是 MongoDB shell 中的基本查询:
> db.cars.update( wheels : 3 , $inc : wheels : 1 );
在 Mongoose 中,您可以为选项和回调函数添加额外的参数,但这是基本思想。
【讨论】:
我认为这对应于mongoosejs.com/docs/api.html#model_Model.update 而不是mongoosejs.com/docs/api.html#document_Document-update以上是关于如何在 Mongoose 中使用 Document#update?的主要内容,如果未能解决你的问题,请参考以下文章
NestJS + Mongoose:如何测试 document(data).save()?
无法使用 mongoose、Node.js 将数据插入到 mongoDB 中的 Document 字段中