2017-08-19 2 views
-1

Dans mon projet Projet Node and Mongo, j'utilise mongoose pour ma modélisation. J'essaie d'effectuer une recherche sur un document imbriqué. J'ai un objet thread, avec un tableau d'objets "post" comme l'une de ses propriétés. L'une des propriétés de cet objet "post" imbriqué est un user_id, la personne qui a posté. J'ai essayé de rechercher le user_id (ie - localfield: thread.post.user_id, des utilisateurs, foreignfield: _id) mais le shell ne retourne rien.

Quelqu'un peut-il proposer un amendement à ce que j'ai essayé ci-dessous:

db.threads.aggregate([ 
{ "$match": { "posts._id": ObjectId("abcdef") } }, 
{ "$sort": { "dateAdded": -1 } }, 
{ "$limit": 15 }, 
{ "$lookup": {"localField": "posts.user_id","from": "users","foreignField": "_id","as": "userinfo"} }, 
{ "$unwind": "$userinfo" }, 
{ "$project":{"dateAdded":1,"userinfo.name":1,"userinfo.username":1}} 
]); 

Et un échantillon des dossiers dans mes collections

db.threads.find ({}) retourne ...

{ 
"_id" : ObjectId("78910"), 
"dateAdded" : ISODate("2017-08-18T16:44:23Z"), 
"title" : "Thread Zero", 
"posts" : [ { 
"_id" : ObjectId("abcdef"), 
"user_id" : ObjectId("12345"), 
"postText" : "good evening", 
"dateAdded" : "2017-8-18 17:44:34" } ], 
"__v" : 0 
} 

db.users.find ({}) ... les retours

objet utilisateur ExempleDonc, à partir de là, je voudrais retourner la propriété name de l'objet "user" pour chacun des messages sur le fil. Ce que j'ai écrit est une tentative pour obtenir le nom d'utilisateur de l'annonce de l'utilisateur pour un poste spécifique, je suppose que récupérer le nom d'utilisateur et le nom pour tous les commentaires est de laisser le paramètre $ match vide, lui permettant de renvoyer une liste de messages avec le nom d'utilisateur/nom d'utilisateur

Est-ce que quelqu'un peut le confirmer?

+0

Le champ 'user_id": "12345" 'contient une" chaîne "que vous essayez de faire correspondre avec' _id' qui contient un 'ObjectId'. Vous devez donc corriger les données dans 'user_id' pour qu'elles contiennent les mêmes valeurs' ObjectId' que celles référencées dans l'autre collection Notez que vous avez besoin de MongoDB 3.4 pour utiliser une source dans un tableau. vous devrez également "$ unwinding" le tableau avant le '$ lookup' en utilisant les versions antérieures –

+0

Toutes les excuses, typo. user_id dans threads.posts devrait lire ObjectId (" 12345 "), pas" 12345 " – OisinFoley

+0

Non ce n'est pas 'ObjectId (" 12345 ")' parce que ce n'est pas une valeur valide pour un 'ObjectId' Si vous voulez de l'aide pour vos questions, vous devez produire les ** données réelles ** et non pas un résumé ou une obfuscation. pirater votre système basé sur vous affichant les données réelles ici. Il suffit donc de publier les données réelles d'une manière qui peut être reproduite. Voir [Comment créer un exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve). Mais c'est certainement une incompatibilité de type ou un nom de collection incorrect. Ce sont les deux seules causes possibles de l'absence de résultat. Ou bien, la version MongoDB. –

Répondre

0

Je troqué ObjectId une propriété UUID ObjectId est en désordre à traiter (le retour de la fonction de .Find de Shell Mongo() comme ObjectId (« 5998a2a81762e90ce9f55d92 »), puis lors de la lecture de la base de données, il est juste alphanumérique (« 5998a2a81762e90ce9f55d92 ») le rendement puis en saisissant que alphanumérique dans la coque pour tester les commandes renvoie toujours null)

Voici résolu mon problème,

db.threads.aggregate([ 
    {$match: {uuid: 'de36dd72-238b-47b0-b363-3fbfa1f2743e'}}, 
    {$unwind:"$posts"}, 
    {$lookup: { 
     from: 'users', 
     localField: 'posts.user_uuid', 
     foreignField: 'uuid', 
     as: 'userInfo'}} 
]); 

Cette MongoDB $lookup on nested document se sont avérées utiles. Espérons que cela aidera quelqu'un d'autre le long du chemin