MongoDB - 更新不同类型的数组(discriminatorKey)

时间:2017-11-20 14:08:55

标签: mongodb express discriminator

我有一个可以包含不同子文档数组的文档。

将文档保存到数据库工作正常,结构正是我需要的。

我的问题是我无法更新“sections”数组(下面的架构)

中的值
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const logoSchema = require('./site-sections/logo');

var sectionSchema = new Schema(
  {
    show: { type: Boolean, default: true },
    order: Number
  },
  { discriminatorKey: 'type' }
);

const siteSchema = new Schema({
  _user: { type: Schema.Types.ObjectId, ref: 'User' },
  type: { type: String, required: true },
  title: { type: String, default: '' },
  name: { type: String, required: true },
  password: { type: String, default: '' },
  caching: { type: Number, default: 1 },
  unique_id: { type: String, required: true },
  sections: [sectionSchema]
});

const sectionArray = siteSchema.path('sections');

const headerSchema = new Schema({
  image: { type: String, default: '' },
  title: { type: String, default: '' },
  sub_title: { type: String, default: '' },
  show: { type: Boolean, default: true },
  logo: logoSchema
});

sectionArray.discriminator('header', headerSchema);

const textSchema = new Schema({
  text: String
});

sectionArray.discriminator('text', textSchema);

module.exports = mongoose.model('site', siteSchema);

我的更新功能:

req.body has the following value:
{ key: 'title',
  value: 'Test',
  unique_site_id: '_jxn7vw' }

    const Site = require('../../models/site');

    exports.update = async function(req, res, next) {
      console.log(req.body);
      if (req.body.unique_site_id) {
        Site.update(
          {
            unique_id: req.body.unique_site_id,
            _user: req.user.id,
            'sections.type': 'header'
          },
          {
            $set: {
              ['sections.$.' + req.body.key]: req.body.value
            }
          },
          function(err, status) {
            if (err) {
              console.log(err);
              return res.status(500).send();
            }
            console.log(status);
            return res.status(200).send();
          }
        );
      }
    };

console.log(status)始终打印:{ ok: 0, n: 0, nModified: 0 }

如何更新标题值?

1 个答案:

答案 0 :(得分:0)

无法更新判别键。 https://github.com/Automattic/mongoose/issues/3839

  

确定。所以正确的顺序是:

     
      
  1. 使用toObject()
  2. 将mongoose文档转换为对象   
  3. 更改鉴别器,并更改/删除其他属性
  4.   
  5. 使用hydrate()
  6. 转换回mongoose文档   
  7. 保存
  8.