我的项目中有这个猫鼬模式:
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 时,即使指定的名称和路径与另一个现有类别相对应,数据也会保存在数据库中,并且不会返回错误。所以最后我有两个或两个以上具有相同名称和路径的类别。正是我不想要的。
有人可以帮忙吗?谢谢。
答案 0 :(得分:0)
在mongo风格中,使用“ $”位置运算符。查看此link了解详情。
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{ $set: { "my_array.$.content" : "NEW content B" } }
)