发布
社区首页 >问答首页 >猫鼬从findByIdAndUpdate (继承模式)中删除数组

猫鼬从findByIdAndUpdate (继承模式)中删除数组
EN

Stack Overflow用户
提问于 2015-04-30 11:51:20
回答 2查看 880关注 0票数 2

我试着用findByIdAndUpdate更新一只猫鼬模型

为了解决这个问题,这个模型被称为ItemVariant,它继承了Item

有效载荷数据的一个例子是:

代码语言:javascript
代码运行次数:0
复制
var data = {
  arrayField: [ 1, 3 ],
  description: 'This is a description' }
}

如果我打电话

代码语言:javascript
代码运行次数:0
复制
ItemVariant.findByIdAndUpdate(objectId, data);

我可以看到描述被更新了,但是arrayField根本没有传递给mongo -实际上所有的数组都被删除了数据对象。

我一直在试图弄清楚如何做到这一点,我看过如何为数组设置$pushAll,但似乎没有什么效果。

这里有什么东西我遗漏了吗?

模型架构是继承的。猫鼬模型看起来是这样的:

代码语言:javascript
代码运行次数:0
复制
function ItemVariantSchema() {
    var self = this;
    Schema.apply(this, arguments);

    self.add({           
        description: [String],
        arrayField: [Number]
    });
}
util.inherits(ItemVariantSchema, ItemSchema);

// the field that represents the sub-class discriminator
var schemaOptions = {
    discriminatorKey: 'type'
};

// create ItemVariant schema
var itemVariantSchema = new ItemVariantSchema({}, schemaOptions);

// create ItemVariant model
Item.discriminator('Variant', itemVariantSchema);

// Export the ItemVariant schema
module.exports = ItemVariantSchema;

单神输出的一个例子--详细的输出:

代码语言:javascript
代码运行次数:0
复制
command: findAndModify { findandmodify: "itemvariants", query: { _id: ObjectId('5541fb680dc0e9223bea1ddb') }, new: 1, remove: 0, upsert: 0, update: { $set: { description: "EDIT: some description" } } } update: { $set: { description: "EDIT: some description" } } nscanned:1 nscannedObjects:1 nMatched:1 nModified:0 keyUpdates:0 numYields:0 locks(micros) w:104 reslen:358 0ms

如您所见,arrayField已被删除

我也尝试过这样的方法:

代码语言:javascript
代码运行次数:0
复制
var data = {
    $set: { description: 'This is a description' },
    $push: { arrayField: [ 1, 3 ] }
}

但是,当$push数组到达mongo时,它似乎是空的。

此外,正如@chridam所建议的,我也尝试过这样的方法:

代码语言:javascript
代码运行次数:0
复制
var data = {
    $set: {
        description: 'some description' 
    },
    $addToSet: {
        arrayField: {
            $each: [2, 3]
        }
    }
}

输出现在如下所示:

代码语言:javascript
代码运行次数:0
复制
command: findAndModify { findandmodify: "itemvariants", query: { _id: ObjectId('5541fb680dc0e9223bea1ddb') }, new: 1, remove: 0, upsert: 0, update: { $set: { description: "EDIT: another description" }, $addToSet: { arrayField: {} } } } update: { $set: { description: "EDIT: another description" }, $addToSet: { arrayField: {} } } nscanned:1 nscannedObjects:1 nMatched:1 nModified:1 keyUpdates:0 numYields:0 locks(micros) w:118 reslen:366 0ms
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 14:03:11

看来遗产是这里的罪魁祸首。

猫鼬模型需要来自鉴别者:

代码语言:javascript
代码运行次数:0
复制
var ItemVariant = Item.discriminators['Variant'];
ItemVariant.findByIdAndUpdate(objectId, data);

这对我来说很管用。阵列的拍击有点像红鲱鱼。而我的问题并没有描绘出整个情况。谢谢帮助@chridam

票数 0
EN

Stack Overflow用户

发布于 2015-04-30 12:07:53

您需要使用$set操作符:

代码语言:javascript
代码运行次数:0
复制
var data = {
   "arrayField": [ 1, 3 ],
   "description": "This is a description" 
};

ItemVariant.findByIdAndUpdate(objectId, { "$set": data });

-更新 --

尝试将$set update运算符与description字段中的$each更新运算符和$addToSet运算符与arrayField数组字段上的$each修饰符结合使用。$each修饰符允许$addToSet操作符向数组字段添加多个值:

代码语言:javascript
代码运行次数:0
复制
var data = {
   "arrayField": [ 1, 3 ],
   "description": "This is a description" 
};

var update = {
    "$set": {
        "description": data.description
    },
    "$addToSet": {
        "arrayField": {
            "$each": data.arrayField
        }
    }
};

ItemVariant.findByIdAndUpdate(objectId, update, options, callback);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29967032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档