javascript - body - La mangosta no crea índices
title html attribute (4)
Tratando de crear índices de MongoDB. Utilizando el ODM de Mongoose y en mi definición de esquema a continuación, tengo el campo de nombre de usuario configurado en un índice único. La colección y el documento se crean correctamente, solo los índices no funcionan. Toda la documentación dice que el comando garantizarIndex debe ejecutarse al inicio para crear cualquier índice, pero no se está realizando ninguno. Estoy usando MongoLab para hospedar si eso importa. También he dejado caer repetidamente la colección. Qué está mal.
var schemaUser = new mongoose.Schema({
username: {type: String, index: { unique: true }, required: true},
hash: String,
created: {type: Date, default: Date.now}
}, { collection:''Users'' });
var User = mongoose.model(''Users'', schemaUser);
var newUser = new Users({username:''wintzer''})
newUser.save(function(err) {
if (err) console.log(err);
});
Conecte el evento ''index''
en el modelo para ver si se producen errores al crear el índice de forma asíncrona:
User.on(''index'', function(err) {
if (err) {
console.error(''User index error: %s'', err);
} else {
console.info(''User indexing complete'');
}
});
Además, habilite el registro de depuración de Mongoose llamando a:
mongoose.set(''debug'', true);
El registro de depuración le mostrará la llamada ensureIndex
que está haciendo para que usted cree el índice.
Cuando enganché el evento de índice en el modelo que no estaba funcionando, comencé a recibir un error en la consola que indicaba "El campo ''retryWrites'' no es válido para una especificación de índice". El único lugar en mi aplicación que hacía referencia a ''retryWrites'' estaba al final de mi cadena de conexión. Quité esto, reinicié la aplicación y la reconstrucción del índice fue exitosa. Puse retryWrites de nuevo en su lugar, reinicié la aplicación y los errores desaparecieron. Mi colección de Usuarios (que me había estado dando problemas) estaba vacía, así que cuando usé Postman para crear un nuevo registro, vi (con Mongo Compass Community) el nuevo registro creado y ahora aparecen los índices. No sé qué hace retryWrites (y hoy fue el primer día que lo usé), pero parecía estar en la raíz de mis problemas.
Ah, y por qué lo uso? Fue insertado en una cadena de conexión que saqué del sitio Atlas Cloud de Mongo. Parecía importante. Hmm
Mongoose declara "si el índice ya existe en la db, no será reemplazado" ( credit ).
Por ejemplo, si anteriormente ha definido el índice {unique: true}
pero desea cambiarlo a {unique: true, sparse: true}
, desafortunadamente, Mongoose simplemente no lo hará, porque ya existe un índice para ese campo en el campo DB.
En tales situaciones, puede eliminar su índice existente y luego Mongoose creará un nuevo índice de nuevo:
$ mongo
> use MyDB
> db.myCollection.dropIndexes();
> exit
$ restart node app
¡Tenga en cuenta que esta es una operación pesada, así que tenga cuidado con los sistemas de producción!
En una situación diferente, no se estaban creando mis índices, así que usé la técnica de informe de errores recomendada por JohnnyHK. Cuando hice eso obtuve la siguiente respuesta:
E11000 duplicate key error collection
Esto se debía a que mi nuevo índice estaba agregando la restricción unique: true
pero había documentos existentes en la colección que no eran únicos, por lo que Mongo no pudo crear el índice.
En esta situación, necesito arreglar o eliminar los documentos con campos duplicados, antes de volver a intentar crear el índice.
Podría ser resolver tu problema
var schema = mongoose.Schema({
speed: Number,
watchDate: Number,
meterReading: Number,
status: Number,
openTrack: Boolean,
});
schema.index({ openTrack: 1 });