猫鼬JS-防止ObjectId数组重复

时间:2019-02-18 22:23:26

标签: mongodb mongoose mongoose-populate

我正在使用ObjectId在MongoDB中的2个集合之间形成关系,见下文:

const userSchema = new Schema({

    username: { type: String, unique: false, required: false },
    password: { type: String, unique: false, required: false },
    concerts:[
        {
            type: Schema.Types.ObjectId,
            ref: "Concert", unique: true, required: false   
        }
    ]

})
const concertSchema = new Schema({
    userId: {type: String, unique: false, required: false},
    concertId: { type: Number, unique: false, required: false },
    artist: { type: String, unique: false, required: false },
    venue: { type: String, unique: false, required: false },
    date: { type: Date, unique: false, required: false },
    time: { type: String, unique: false, required: false },
    city: { type: String, unique: false, required: false },
    latitude: { type: Number, unique: false, required: false },
    longitude: { type: Number, unique: false, required: false },
    attendees: [
        {
        type: Schema.Types.ObjectId,
        ref: "User", unique: true, required: false    
        }
]

})

但是,我遇到了数据库中重复的ObjectId的问题,下面是我向数据库中添加ObjectId的代码段:

then(show => {
            return db.User.findOneAndUpdate(
                {
                    "_id": req.body.userId
                }, {
                    $push: {concerts: show._id}
                }, {
                    new: true
                }
            ).then(res.json(show))
        })
            }
        else {
            return db.User.findOneAndUpdate(
                {
                "_id": req.body.userId
            }, {
                $push: {concerts: concert._id}
            }, {
                new: true
            })
            .then(res.json(concert))
        }
        })

我尝试了$ addToSet,但是据我了解,这不适用于对象。

1 个答案:

答案 0 :(得分:0)

$addToSet不适用于对象,但可以与ObjectIds一起使用(因为它们本质上只是特殊的字符串)

> db.test_coll.insert({})
WriteResult({ "nInserted" : 1 })
> db.test_coll.findOneAndUpdate({}, {$addToSet: {ids: ObjectId("5c6b6714f5b3e45884d12630") }}, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b69a6f5b3e45884d12632"),
    "ids" : [
        ObjectId("5c6b6714f5b3e45884d12630")
    ]
}
> db.test_coll.findOneAndUpdate({}, {$addToSet: {ids: ObjectId("5c6b6714f5b3e45884d12630") }}, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b69a6f5b3e45884d12632"),
    "ids" : [
        ObjectId("5c6b6714f5b3e45884d12630")
    ]
}
> db.test_coll.findOneAndUpdate({}, {$addToSet: {ids: ObjectId("5c6b6714f5b3e45884d12630") }}, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b69a6f5b3e45884d12632"),
    "ids" : [
        ObjectId("5c6b6714f5b3e45884d12630")
    ]
}
相关问题