2017-06-08 1 views
0

Je suis nouveau dans la base de données NoSQL et je veux trouver un moyen de rechercher tous les éléments de la matrice basée sur une clé, par exemple: si nous avons cette base de données .collection ("col")Rechercher un article dans une collection basée sur une clé dynamique

{ 
    "_id" : ObjectId("59389f763007e086bc310c73"), 
    "messageIds" : [ 
     1, 
     2, 
     3, 
     4, 
     5 
    ], 
    "participants" : { 
     "59389e953007e086bc310c36" : 0, 
     "59389ea63007e086bc310c41" : 0 
    }, 
    "type" : "f" 
} 

Comment trouver tous les documents qui ont les participants "59389e953007e086bc310c36" à Node.js?

En MongoDB je peux trouver tous les articles mais

db.getCollection('conversations').find(
    { 
     "participants.59389e953007e086bc310c36" : 
      { 
       $exists: true 
      } 
    }) 

Je ne peux pas le faire dans Node.js parce qu'il ne va pas évaluer user_oid en valeur

user_oid = "participants."+user_oid; 
    let criteria = { 
     user_oid: { $exists: true } 
    } 

    console.log(criteria); 
    database.collection(CONVERSATION_COLLECTION).find(criteria, (err,doc) => { 
     console.log(doc); 
     console.log; 

    }) 
+0

Bien sûr, vous pouvez. Fondamentalement, vous obtenez soit cette valeur de 1.) Demande d'entrée où il va être une chaîne. 2.) Le résultat d'une autre opération où c'est un 'ObjectId' mais il a une méthode' .toString() 'qui devrait simplement être appelée dans le contexte de la jonction avec une chaîne. Dans le cas 2, vous pouvez même appeler 'user_oid.toString()' explicitement. Ce n'est pas un bon modèle d'avoir des clés nommées, mais rien ne vous empêche de le faire. –

+0

Le problème est que vous devriez faire 'let criteria = {}; criteria ["participants." + user_oid.toString()] = {$ existe: vrai}; ' –

+0

Merci cela fonctionne! –

Répondre

0

Vous pouvez utiliser [] pour définir champ dynamiquement

let criteria = {}; 
criteria['participants.'+user_oid] = { $exists: true }; 

console.log(criteria); 
database.collection(CONVERSATION_COLLECTION).find(criteria, (err,doc) => { 
    console.log(doc); 
    console.log; 
});