node.js mongodb mongoose contains

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 }