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