addToSet等效于包含子文档

时间:2016-12-24 06:24:41

标签: node.js mongodb mongoose mongodb-query

我有一个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数组中添加唯一子文档的方法。

1 个答案:

答案 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添加字段