我有官员Schema,如果用户想要修改约会,他的输入是在DB中进行的。架构是:
officerSchema = mongoose.Schema({
email : {type: String,
index: { unique: true }
},
appointmentList : Array // array of jsonObject of dates and userID
});
AppointmentList是一个JSON对象数组,其中包含必须进行约会的人员的ID,日期和用户ID(想要修复约会的用户)。
然而,为了避免重复的约会条目,我一直在使用互联网上提到的几种方法。到目前为止,他们都没有为我工作过。我发布下面的代码。以下代码的问题是它永远不会在appointmentmentsList中插入任何数据。但是,如果我使用 save()而不是更新()插入,但也会插入重复项。
以下是我想在DB数组中添加的JSON对象,
{
"id": "1321231231",
"appointment": {
"userID": "31321",
"date": "24 March"
}
}
var ID = requestObject.id;
var newObject = {$addToSet: requestObject.appointment};
OfficerModel.findOne({_id : ID}, function(err, foundData) {
if(err) {
console.log(err);
return;
}
else {
var dbList = foundData.list;
dbList.push(newObject);
foundData.update(function(err, updatedData) {
if(err) {
console.log( err);
}
else {
console.log("successful");
}
});
}
});
答案 0 :(得分:0)
使用$addToSet运算符可能适合您。
var appt = {
id: "1321231231",
appointment: {
userID: "31321",
date: "24 March"
}
}
Officer.update(
{_id: ID},
{$addToSet: {appointmentList: appt}},
function(err) { ... }
);
但它不是一个完美的解决方案,因为{one:1,2,2:}和{two:2,one:1}不会被解释为相等,所以它们都可以添加到带有$ addToSet的数组中。 / p>
为了完全避免重复,你可以这样做:
var appt = {
id: "1321231231",
appointment: {
userID: "31321",
date: "24 March"
}
};
Officer.findOne(
{_id: ID, 'appointmentList.id': appt.id},
function(err, officerDoc) {
if (err) { ... }
// since no document matched your query, add the appointment
if (!officerDoc) {
Officer.update(
{_id: ID},
{$push: {appointmentList: appt}},
function(err) { ... }
);
}
// since that appointment already exists, update it
else {
Officer.update(
{_id: ID, 'appointmentList.id': appt.id},
{$set: {'appointmentList.$.appointment': appt.appointment}},
function(err) { ... }
);
}
}
);
更新现有约会的上述操作使用positional operator。