【问题标题】:How to use Document#update in Mongoose?如何在 Mongoose 中使用 Document#update?
【发布时间】: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提供的示例代码?

【问题讨论】:

    标签: mongodb 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 中,您可以为选项和回调函数添加额外的参数,但这是基本思想。

    猜你喜欢
    • 2014-06-04
    • 2021-01-31
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2018-06-21
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多