#javascript #mongodb #mongoose #mongodb-query #mongoose-schema
Вопрос:
const popupSchema = new mongoose.Schema(
{
/**
* @type schema field / ObjectId
* @description User whose popus are stored.
* @note should be required
*/
user_id: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required:true,
index: { unique: true }
},
/**
* @type schema field / Array
* @description Information of all the popups of the User.
*/
popupsArray: [popupDetails]
},
opts
);
Это моя схема, и я хочу сделать user_id уникальным индексом. В схеме нет другой записи с тем же идентификатором пользователя.
Я запускаю этот сценарий, чтобы добиться того же самого:
await popups
.createIndexes(
{user_id:1}
)
.then(res => {
console.log("done")
}
).catch((err)=>{
console.log("error in indexing popups",err)
})
Но этот сценарий заканчивается ошибкой =>>
Индекс с именем: user_id_1 уже существует с различными опциями.
{
ок: 0,
код: 85,
кодовое имя: «Indexoptionconflict»
}
Как я могу сделать идентификатор пользователя unique_index? Я также попробовал required:true в user_id, но это не сработает.
Я добавил required:true
это непосредственно перед запуском этого сценария. Будет ли это иметь какое-то значение?
Комментарии:
1. Я подозреваю, что индекс уже создан. Что делать с этим в панцире монго
db.popup.getIndexes()
2. Я проверил компас, он только _id уникален!
3. Это не гарантирует, что индекс для user_id уже не существует. Проверьте, действительно ли вы можете узнать, существует ли индекс, в этом и заключается ошибка.
4. В любом случае, что бы я изменил в вашем коде, если бы написал его, было бы :
let result = await popups .createIndex( {user_id: 1},{unique: true} ); console.log(result);
5. С await вам тогда не понадобится. Также вы можете использовать createIndex здесь вместо createIndexes.