Mongoose JS - Предотвращение дубликатов в массиве ObjectIds - PullRequest
0 голосов
/ 19 февраля 2019

Я использую ObjectIds для формирования отношений между 2 коллекциями в MongoDB, см. Ниже:

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 голосов
/ 19 февраля 2019

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