我的jqgrid中有一个学生列表。如果我想将一个学生列表分配给一个员工,那么我只是检查我想要的学生,然后我分配给一个员工,使员工记录如下所示
我的员工记录:
{
"_id": "ObjectId("58622e3bf39d570b21ece1b3")",
"name" : "Alex",
"__v" : 6.0,
"students" : [
"586f8f0cd26a47718b9db4d6",
"586f8ef5d26a47718b9db4d4",
"586538693b5b5d5d8bc46b1f"
]
}
我的学生领域模型:
students: {
type: Array,
default: ''
},
我的后端代码:
exports.update = function (req, res) {
var body = req.body;
employee = _.extend(employee, req.body);
employee.save(function (err) {})
};
在这里,我很高兴,但我没有在这做两件事
我想将学生ID存储为
ObjectId("58622e3bf39d570b21ece1b3")
但它存储为
58622e3bf39d570b21ece1b3
当我指派学生时,不应插入重复的记录,即不应再插入学生已存在。
答案 0 :(得分:1)
有两个问题和几个问题。
students
数组。您应该指定数组中的项目类型,然后mongoose会将这些项目转换为ObjectID,即使它们来自前端的字符串。所以你的架构看起来应该更像这样:
students: [ { type: mongoose.Schema.Types.ObjectId }]
MongoDB可以确保只在整个集合中进行,而不是单个数组。但你可以通过使用$ addToSet - >来做到这一点。然后mongoDB将确保跳过欺骗。
编辑:根据评论请求,显示子阵列唯一性的示例。
正如我所说,你不能让MongoDB在单个文档中放置一个索引。你必须在应用程序中这样做。但正如我所说,你可以直接使用$ addToSet。 E.g。
employees.update({
_id: req.params.id
},
{
$addToSet: {
students: {
$each: req.body.studetns
}
}
}).exec().then(response => res.json(response)).catch(next); // or whatever.