Para mi proyecto, quiero mantener una mangosta documento para grupos de organizaciones, como este:

var groupSchema = Schema({
  name : { type : String },
  org : { type : Schema.Types.ObjectId, ref : 'Organization' },
  ...
  users : [{
    uid : { type : Schema.Types.ObjectId, ref : 'User' },
    ...
  }]
});

Quiero evitar que un mismo usuario en el mismo grupo dos veces. Para hacer esto, tengo que obligar a los usuarios.uid a ser único en el que los usuarios de la matriz. He intentado afirmando que «exclusiva : la verdadera’ uid, pero que no funcionó. Es allí una manera de hacer esto con la mangosta o mongoDB sin consultas adicionales o dividir el esquema?

Editar:
He cambiado el valor anterior de uido
uid : { type : Esquema.Tipos.ObjectId, ref : ‘Usuario’, índice: {único: true, dropDups: true} }
Pero esto no parece funcionar.

Edición: Suponiendo que no hay manera sencilla de lograr esto, he añadido un extra de consulta de la comprobación de si el usuario ya está en el grupo. Me parece que esta es la manera más simple.

  • marque esta será de ayuda
  • Gracias por el enlace. He intentado lo siguiente: uid : { type : Esquema.Tipos.ObjectId, ref : ‘Usuario’, índice: {único: true, dropDups: true} } en lugar de el valor antiguo de la uid. Con esto no funciona, también he probado a reiniciar mongoDB sin éxito.

2 Comentarios

  1. 81

    Un índice único en un campo de matriz exige que el mismo valor no puede aparecer en las matrices de más de un documento en la colección, pero no impide que el valor mismo de la que aparecen más de una vez en un único documento de la matriz. Por lo que necesita para garantizar la unicidad como agregar elementos a la matriz en su lugar.

    Utilizar el $addToSet operador para agregar un valor a una matriz sólo si el valor ya no está presente.

    Group.update({name: 'admin'}, {$addToSet: {users: userOid}}, ...

    Sin embargo, si el users matriz contiene objetos con múltiples propiedades y desea garantizar la unicidad en sólo uno de ellos (uid en este caso), entonces usted necesita para tomar otro enfoque:

    var user = { uid: userOid, ... };
    Group.update(
        {name: 'admin', 'users.uid': {$ne: user.uid}}, 
        {$push: {users: user}},
        function(err, numAffected) { ... });

    Lo que hace es calificar a la $push actualización sólo se producen si user.uid no existe ya en el uid campo de cualquiera de los elementos de users. Por lo que imita $addToSet comportamiento, pero sólo para uid.

    • Pero, ¿cómo puede la fuerza sólo uid a ser único? En el los usuarios de la matriz, tengo más atributos que podrían ser diferentes cada vez que me agregue al mismo usuario (como la fecha).
    • Muchas gracias por su aportación. He leído acerca de los validadores, pero no veo una manera más fácil de añadir un extra de consulta de la comprobación de si el usuario ya está en el grupo.
    • He añadido una manera de apoyar su caso de uso específico.
    • ¿Cómo podemos garantizar que esta en la creación de un objeto por primera vez, con la validación o pre guardar ganchos ?
    • Cómo acerca de la actualización del usuario con un uid? Cómo sería eso posible?
    • ¿Cómo sería este enfoque de trabajo si hay más de 1, siendo el usuario el añadido? Para una matriz de objetos? Gracias
    • Mejor es preguntar a cualquiera de preguntas de seguimiento mediante la publicación de una nueva pregunta.
    • stackoverflow.com/questions/53016319/…

  2. 3

    Bien esto podría ser la vieja pregunta pero para mangosta > v4.1, puede utilizar $addToSet operador.

    Los $addToSet operador agrega un valor a una matriz a menos que el valor ya está presente, en cuyo caso $addToSet no hace nada para que la matriz.

    ejemplo:

    MyModal.update(
       { _id: 1 },
       { $addToSet: {letters: [ "c", "d" ] } }
    )
    • No creo que este es un buen ejemplo, ya que esto podría anexar toda la matriz de ["c", "d"] a la matriz letters como uno de los elementos, por lo que las cartas se ["a", "b", ["c", "d"]] consulte mongodb docs

Dejar respuesta

Please enter your comment!
Please enter your name here