如何在 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 : 1w 任何内容...所以是的,看来文档是错误的。

但是,您可以在有或没有这些选项的情况下使用它。

所以看起来像这样没有任何选项

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中修改结果查询,而不影响实际文档?

无法使用 mongoose、Node.js 将数据插入到 mongoDB 中的 Document 字段中

mongoose 文档 Population

如何在等待中指定 Typescript Mongoose 模型类型

Model 类如何成为 Document 类的子类?