我有一个userSchema
,其中包含一个id和一组朋友。朋友数组实际上是另一个模式的数组,它包含id,gender和name,因此是一个SubDocuments数组。
var attributesSchema = new Schema({
id: String,
gender: String,
name: String
})
var userSchema = new Schema({
id: {
type: String,
unique: true,
required: true
},
Friends: [attributes]
});
之前,我曾经Friends
等于String
的数组。 AddToSet
在这种情况下运行正常,因为它不会在Friends
数组中添加内容,除非它有不同的字符串值。但是,遗憾的是,对于子文档,addToSet无法确定某些内容是否重复。
我没有复制subDocuments的尝试如下:
User.update({
id: req.body.userId
}, {
$addToSet: {
Friends: {
id: req.body.friendId,
gender: req.body.gender,
name: req.body.name
}
}
});
显然,这不起作用,我正在寻找一种在Friends
数组中添加唯一子文档的方法。
答案 0 :(得分:2)
当元素与子文档元素不匹配时,您可以使用$not
和$elemMatch
实际更新:
User.update({
"id": req.body.userId,
"Friends": {
"$not": {
"$elemMatch": {
"id": req.body.friendId
}
}
}
}, {
$addToSet: {
Friends: {
"id": req.body.friendId,
"gender": req.body.gender,
"name": req.body.name
}
}
});
如果您有其他重复条件,则可以向$elemMatch
添加字段