addToSet相当于包含子文档的数组
我有一个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
工作,因为除非具有不同的string值,否则不会在Friends
数组中添加内容。 但是,不幸的是,对于子文档,addToSet不能确定是否有重复。
我在不复制子文档的尝试如下:
User.update({ id: req.body.userId }, { $addToSet: { Friends: { id: req.body.friendId, gender: req.body.gender, name: req.body.name } } });
显然,这是行不通的,我正在寻找一种方法来添加Friends
数组中的独特的子文档。
当元素不匹配子文档元素时,可以使用$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