node.js - elementos - array de objetos javascript
Mangosta Valores Ășnicos en una matriz anidada de objetos (1)
Un índice único en un campo de matriz impone 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 mismo valor aparezca más de una vez en la matriz de un solo documento. Por lo tanto, debe garantizar la exclusividad a medida que agrega elementos a la matriz.
Use el operador $addToSet
para agregar un valor a una matriz solo si el valor no está presente.
Group.update({name: ''admin''}, {$addToSet: {users: userOid}}, ...
Sin embargo, si la matriz de users
contiene objetos con propiedades múltiples y desea garantizar la exclusividad de uno solo de ellos ( uid
en este caso), entonces debe adoptar 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 la actualización de $push
para que solo ocurra si user.uid
no existe en el campo uid
de cualquiera de los elementos de los users
. Entonces imita el comportamiento de $addToSet
, pero solo para uid
.
Para mi proyecto, quiero guardar un documento de mangosta 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 el mismo usuario esté en el mismo grupo dos veces. Para hacer esto, necesito forzar a users.uid a ser único en la matriz de usuarios. Intenté decir ''unique: true'' para uid, pero eso no funcionó. ¿Hay alguna manera de hacer esto con mongoose o mongoDB sin consultas adicionales o dividir el esquema?
Editar: Cambié el valor anterior de uid a uid: {type: Schema.Types.ObjectId, ref: ''User'', index: {unique: true, dropDups: true}} Pero esto todavía no parece funcionar.
Editar: Suponiendo que no hay una manera simple de lograr esto, agregué una consulta adicional que verifica si el usuario ya está en el grupo. Esto me parece la forma más simple.