node.js - mongoose-compruebe si ObjectId existe en una matriz
mongodb contains (3)
Creo que esta es una pregunta de JavaScript en lugar de una pregunta de Node.js / Mongoose, por lo que realmente no pertenece a la forma en que está actualmente.
Además, el problema con about.id in user.friends
es que el objeto señalado por about.id
y los objetos en user.friends
son diferentes; Y creo in
cheques por la igualdad del objeto.
De todos modos, la respuesta está disponible en el desbordamiento de pila para verificar dónde existe un elemento en una matriz:
user.friends.indexOf(about.id) > -1
A continuación se muestra un modelo de ejemplo:
UserModel == {
name: String,
friends: [ObjectId],
}
friends
corresponde a una lista de id
de objetos de algún otro modelo, por ejemplo, AboutModel
.
AboutModel == {
name: String,
}
User.findOne({name: ''Alpha''}, function(error, user){
About.find({}, function(error, abouts){ // consider abouts are all unique in this case
var doStuff = function(index){
if (!(about.id in user.friends)){
user.friends.push(about.id);
about.save();
}
if (index + 1 < abouts.length){
doStuff(index + 1)
}
}
doStuff(0) // recursively...
})
})
En este caso, la condición ''about.id en user.friends'' parece ser siempre falsa. ¿Cómo? ¿Esto tiene que ver con el tipo de ObjectId o la forma en que se guarda?
Nota: ObjectId
es la abreviatura de Schema.ObjectId
; No sé si eso es un problema en sí mismo.
Si about.id
es una representación de cadena de un ObjectID y user.friends
es una matriz de ObjectIDs, puede verificar si about.id
está en la matriz usando Array#some
:
var isInArray = user.friends.some(function (friend) {
return friend.equals(about.id);
});
La llamada a some
repetirá en la matriz user.friends
, llamando a cada uno para ver si coincide con about.id
y se detendrá tan pronto como encuentre una coincidencia. Si encuentra una coincidencia, devuelve true
, de lo contrario false
.
No puede usar algo más simple como indexOf
porque desea comparar los ObjectID por valor, no por referencia.
Uso lo-dash y hago algo así:
var id_to_found = ''...'';
var index = _.find(array, function(ch) {
return ch == id_to_found ;
});
if ( index!=undefined ) {
// CHILD_ALREADY_EXISTS
} else {
// OK NOT PRESENTS
}