【问题标题】:Mongoose JS - Preventing Duplicates in Array of ObjectIdsMongoose JS - 防止 ObjectIds 数组中的重复项
【发布时间】:2019-02-19 10:29:47
【问题描述】:

我正在使用 ObjectIds 在 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 但我的理解是这不适用于对象。

【问题讨论】:

    标签: mongodb mongoose mongoose-populate


    【解决方案1】:

    $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")
        ]
    }
    

    【讨论】:

    • 我将如何在上面的代码中实现它? show._id 和 Concert._id 但会导致数据库中的 ObjectIds 但是当我执行 {$addToSet: {concerts: concert._id}}{$addToSet: {concerts: show._id}} 时,我仍然会得到重复。
    • 您使用的是哪个版本的 mongo?您能否添加一个具有可重现错误的 pastebin?
    猜你喜欢
    • 2016-07-10
    • 2012-09-09
    • 2020-01-24
    • 1970-01-01
    • 2016-10-14
    • 2020-05-18
    • 2016-03-24
    • 2016-03-27
    • 2017-02-22
    相关资源
    最近更新 更多