猫鼬:更新数组中的嵌套对象

时间:2019-07-19 07:41:31

标签: node.js mongodb mongoose

我的项目中有这个猫鼬模式:

const mongoose = require('mongoose');
const schema = mongoose.Schema;

var WebsiteModel = new schema({

    name: {
        type: String,
        required: true,
        unique: true,
        lowercase: true
    },

    createdOn: {
        type: String,
        required: true,
        default: Date.now
    },

    country: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Countries',
        required: true
    },

    categories: [{

        category: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Categories'
        },

        name: {
            type: String,
            required: true,
            lowercase: true,
        },

        path: {
            type: String,
            required: true
        },

        enabled: {
            type: Boolean,
            required: true,
            default: false
        },

        description: {
            type: String,
            required: true,
            default: false
        },
    }]
});

module.exports = mongoose.model('Websites', WebsiteModel);

我想确保在更新或添加类别数组中的文档时,名称,路径和类别ID必须唯一。所以这是我尝试过的:

editWebsiteCategory = (req, resp) => {
    var websiteId = req.params.websiteid;
    var categoryId = req.params.categoryid;
    var categoryDatas = { ...req.body };
    var condition = {
        _id: websiteId,
        'categories.name':{$ne:{categoryDatas.name}},
        'categories.path':{$ne:{categoryDatas.path}},
        'categories._id':{$ne:{categoryDatas._id}},
        'categories._id': categoryId
    };
    if (categoryId && websiteId) {
        websiteModel.findOneAndUpdate(condition,
            { $set: { 'categories.$': categoryDatas } },
            (err, result) => {
                if (err) {

                    resp.status(500).json({ msg: "Internal Server Error !" });
                }

                if (result) {
                    resp.status(200).json(result);
                }
            })
    }
    else {
        resp.status(500).json({ msg: "Internal Server Error !" });
    }
}

CategoryDatas是一个对象,其中包含保存类别的所有必需属性。其结构类似于上述 WebsiteModel 类别数组中的对象文档。

当我运行方法 editWebsiteCategory 时,即使指定的名称和路径与另一个现有类别相对应,数据也会保存在数据库中,并且不会返回错误。所以最后我有两个或两个以上具有相同名称和路径的类别。正是我不想要的。

有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在mongo风格中,使用“ $”位置运算符。查看此link了解详情。

db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  { $set: { "my_array.$.content" : "NEW content B" } }
)