如何在不覆盖当前数据的情况下更新 Mongoose 中的混合类型字段?

Posted

技术标签:

【中文标题】如何在不覆盖当前数据的情况下更新 Mongoose 中的混合类型字段?【英文标题】:How to update mixed type field in Mongoose without overwriting the current data? 【发布时间】:2015-09-18 04:38:44 【问题描述】:

我有以下架构

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ShopSchema = new Schema(
    name: Schema.Types.Mixed,
    country: 
        type: String,
        default: ''
    ,
    createdAt: 
        type: Date,
        default: Date.now
    ,
    defaultLanguage: 
        type: String
    ,
    account: type : Schema.ObjectId, ref : 'Account',
);
mongoose.model('Shop', ShopSchema);

“名称”字段是多语言的。我的意思是,我会保留多语言数据,例如

name: 
    "en": "My Shop",
    "es": "Mi Tienda"

我的问题是,在控制器中,我正在使用此代码来更新商店:

var mongoose = require('mongoose')
var Shop = mongoose.model('Shop')

exports.update = function(req, res) 

Shop.findByIdAndUpdate(req.params.shopid, 
    $set: 
        name: req.body.name
    
, function(err, shop) 
    if (err) return res.json(err);
        res.json(shop);
    );
;

很明显,新数据会覆盖旧数据。我需要的是用新数据扩展旧数据。

有什么方法可以做到吗?

【问题讨论】:

【参考方案1】:

你应该使用方法.markModified()。请参阅文档http://mongoosejs.com/docs/schematypes.html#mixed

由于它是无模式类型,您可以将值更改为您喜欢的任何其他值,但 Mongoose 失去了自动检测和保存这些更改的能力。要“告诉”Mongoose Mixed 类型的值已更改,请调用文档的 .markModified(path) 方法,将路径传递给刚刚更改的 Mixed 类型。

person.anything =  x: [3, 4,  y: "changed" ] ;
person.markModified('anything');
person.save(); // anything will now get saved

【讨论】:

RIP 30-40m 我的生命 :(【参考方案2】:

对特定元素使用"dot notation":

Shop.findByIdAndUpdate(req.params.shopid, 
    "$set": 
        "name.en": req.body.name
    
, function(err, shop) 
    if (err) return res.json(err);
        res.json(shop);
    );
);

如果这是您想要做的,那只会覆盖“en”元素,或者使用您设置的数据“创建”一个新元素。因此,如果您使用了“de”并且它不存在,那么将会有其他元素和一个带有值的新“de”。

【讨论】:

谢谢。但我们不知道数据中是否有“en”或“es”。所以我不能用点符号写 @Burak 你误会了,没有阅读最后的声明。再读一遍。您要么更新现有的东西,要么创建一个新的子元素。这一定是你在这里需要做的,因为我无法想象你会期待什么其他结果。

以上是关于如何在不覆盖当前数据的情况下更新 Mongoose 中的混合类型字段?的主要内容,如果未能解决你的问题,请参考以下文章

在不覆盖数据的情况下更新 SQL LocalDB

如何在不停止站点的情况下更新 ASP.Net 站点 dll

如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用

如何在不影响实际文档的情况下修改 Mongoose 中的结果查询?

在不覆盖 iPhone 上的当前视图的情况下呈现模态视图控制器

如何让 GraphQL 在不进行轮询的情况下从数据库中获取实时/新数据?