Confronto tra mongoose _id e stringhe


197

Ho un'applicazione node.js che estrae alcuni dati e li inserisce in un oggetto, in questo modo:

var results = new Object();

User.findOne(query, function(err, u) {
    results.userId = u._id;
}

Quando faccio un if / then basato su quell'ID memorizzato, il confronto non è mai vero:

if (results.userId == AnotherMongoDocument._id) {
    console.log('This is never true');
}

Quando faccio un console.log dei due ID, corrispondono esattamente:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

Suppongo che si tratti di un tipo di problema relativo al tipo di dati, ma non sono sicuro di come convertire i risultati. UserId in un tipo di dati che provocherà che il confronto di cui sopra è vero e il mio cervello esternalizzato (aka Google) non è stato in grado di aiutare.

Risposte:


360

Mongoose utilizza il driver nativo mongodb, che utilizza il tipo ObjectID personalizzato. È possibile confrontare ObjectID con il .equals()metodo. Con il tuo esempio results.userId.equals(AnotherMongoDocument._id),. Il tipo ObjectID ha anche un toString()metodo, se si desidera archiviare una versione stringita dell'ObjectID in formato JSON o un cookie.

Se si utilizza ObjectID = require("mongodb").ObjectID(richiede la libreria nativa mongodb) è possibile verificare se results.userIdè un identificatore valido con results.userId instanceof ObjectID.

Eccetera.



4
Se lo stai già utilizzando mongoose, puoi semplicemente require('mongoose').mongo.ObjectIDnon elencare altre dipendenze
JoshuaDavid

63

ObjectIDs sono oggetti, quindi se li confronti con quelli ==stai confrontando i loro riferimenti. Se si desidera confrontare i loro valori, è necessario utilizzare il ObjectID.equalsmetodo:

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}

17

convertire l'id oggetto in stringa (usando il metodo toString ()) farà il lavoro.


8

Le risposte accettate limitano davvero ciò che puoi fare con il tuo codice. Ad esempio, non saresti in grado di cercare un array diObject Ids usando il metodo equals. Al contrario, sarebbe più sensato eseguire il cast su stringa e confrontare le chiavi.

Ecco una risposta di esempio nel caso in cui sia necessario utilizzare indexOf()per verificare all'interno di una matrice di riferimenti per un ID specifico. assume queryè una query che stai eseguendo, assume someModelè un modello mongo per l'id che stai cercando e infine assume results.idListè il campo in cui stai cercando il tuo ID oggetto.

query.exec(function(err,results){
   var array = results.idList.map(function(v){ return v.toString(); });
   var exists = array.indexOf(someModel._id.toString()) >= 0;
   console.log(exists);
});

1
o un one-liner:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko

4
@Zlatko non sono un grande fan della nuova sintassi ma a ciascuno il suo.
r3wt

2
@Zlatko const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) o const exists = results.idList.some(val => val.equals(someModel._id))
axanpi,

1
@Zlatko tutti questi anni dopo, e indovina un po '. Preferisco la tua versione alla mia ora. ti dispiace se lo aggiungo alla mia risposta con l'attribuzione corretta?
r3wt

1
Il prezzo del progresso :) Naturalmente puoi usare la risposta, il suo scopo era fornire un'alternativa o aiutare se possibile.
Zlatko,

6

Secondo quanto sopra, ho trovato tre modi per risolvere il problema.

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

0

Ho affrontato esattamente lo stesso problema e ho semplicemente risolto il problema con l'aiuto di JSON.stringify()come segue: -

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}

0

Le tre possibili soluzioni qui suggerite hanno diversi casi d'uso.

  1. Utilizzare .equals quando si confronta ObjectID su due mongoDocuments come questo

    results.userId.equals (AnotherMongoDocument._id)

  2. Utilizzare .toString () quando si confronta una rappresentazione in formato stringa di ObjectID con un ObjectID di un mongoDocument. come questo

    results.userId === AnotherMongoDocument._id.toString ()


Qual è la terza soluzione possibile?
Chris Catignani,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.