2012-03-09 32 views
12

Actualmente estoy siguiendo a Mongoose y MongoDB para un proyecto mío, pero me encuentro con un segmento donde la API no es clara.Valores únicos de matriz en Mongoose

Tengo un modelo que contiene varias claves y documentos, y una de esas teclas se llama watchList. Esta es una matriz de ID que el usuario está mirando, pero necesito estar seguro de que estos valores se mantengan únicos.

Aquí hay un código de ejemplo:

var MyObject = new Mongoose.Schema({ 
    //.... 
    watching : {type: Array, required: false}, 
    //.... 
}); 

Así que mi pregunta es ¿cómo puedo estar seguro de que los valores empujados a la matriz única tienda cada vez uno, así que hacer los valores únicos, ¿puedo usar unique: true?

Gracias

Respuesta

14

Que yo sepa, la única manera de hacer esto en mangosta es llamar al operador Mongo subyacente (mentioned by danmactough). En mangosta, que vería como:

var idToUpdate, theIdToAdd; /* set elsewhere */ 
Model.update({ _id: idToUpdate }, 
      { $addToSet: { theModelsArray: theIdToAdd } }, 
      function(err) { /*...*/ } 
); 

Nota: esta funcionalidad requiere la versión mangosta> = 2.2.2

+3

puede * theIdToAdd * ser una matriz, como '[" ID1 "," ID2 "]'? – RobertPitt

+2

Supongo que podrías usar $ cada una para eso. –

+2

@RoberPitt punto excelente ... theIdToAdd no puede ser una matriz. Si lo haces, el elemento que se insertará será esa matriz. Estoy tratando de encontrar una manera de resolver esto :-( – superiggy

6
+0

Por lo tanto, $ addToSet agregará un nuevo elemento en la matriz si ya no contiene un duplicado. ¿Hay alguna forma (por ejemplo, crear un índice único) que garantice que nunca se dupliquen en una matriz? Básicamente, quiero un Set en lugar de una Sequence. –

1

Mangosta es un modelo de objetos para MongoDB, por lo que una opción es tratar el documento como una objeto javascript normal

MyModel.exec(function (err, model) { 
    if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId); 

    model.save(...callback); 
}); 

Aunque, estoy de acuerdo que mangosta debe tener cierto apoyo a esta construida en forma de un validador para el collection document reference feature - especialmente porque la mayoría de las veces que desea agregar referencias que aparecen unicamente.

+2

This won No funciona si el conjunto se agregó al modelo mediante una operación simultánea, y en su ejemplo, comprobará si el conjunto existe en una copia obsoleta del modelo. Por lo tanto, necesita un índice exclusivo de nivel de base de datos forzado. – ninja123

Cuestiones relacionadas