47 votes

Comment joindre une requête dans mongodb ?

J'ai une collection de documents d'utilisateur comme ceci :

User {
   id:"001"
   name:"John",
   age:30,
   friends:["userId1","userId2","userId3"....]
}

Un utilisateur a de nombreux amis, j'ai la requête suivante en SQL :

select * from user where in (select friends from user where id=?) order by age

J'aimerais avoir quelque chose de similaire dans MongoDB.

0 votes

Peut-être avez-vous besoin de références de base de données - docs.mongodb.org/manual/reference/database-references

2voto

Sérgio Points 854

Une sorte de requête jointe dans mongoDB, consiste à demander à une collection les identifiants qui correspondent, à les mettre dans une liste (idlist), et à effectuer la recherche en utilisant l'autre (ou la même) collection avec $in : idlist.

u = db.friends.find({"friends": ? }).toArray()
idlist= []
u.forEach(function(myDoc) { idlist.push(myDoc.id ); } )
db.friends.find({"id": {$in : idlist} } )

1voto

Mateus Pereira Points 23

Ne remplissez que le tableau des amis.

User.findOne({ _id: "userId"})
.populate('friends')
.exec((err, user) => {
    //do something
});

Le résultat est le même :

{
    "_id" : "userId",
    "name" : "John",
    "age" : 30,
    "friends" : [
        { "_id" : "userId1", "name" : "Derek", "age" : 34 }
        { "_id" : "userId2", "name" : "Homer", "age" : 44 }
        { "_id" : "userId3", "name" : "Bobby", "age" : 12 }
    ]
}

C'est pareil : Mongoose - utilisation de Populate sur un tableau d'ObjectId

0voto

Dean Hiller Points 5292

Vous pouvez utiliser playOrm pour faire ce que vous voulez en une seule requête (avec S-SQL Scalable SQL).

0voto

Piyush Dholariya Points 1103
var p = db.sample1.find().limit(2) , 
    h = [];
for (var i = 0; i < p.length(); i++) 
{
  h.push(p[i]['name']);
}
db.sample2.find( { 'doc_name': { $in : h } } ); 

cela fonctionne pour moi.

0voto

Marcelo Lazaroni Points 3248

Vous pouvez le faire en une seule fois en utilisant mongo-join-query . Voici à quoi cela ressemblerait :

const joinQuery = require("mongo-join-query");

joinQuery(
    mongoose.models.User,
    {
        find: {},
        populate: ["friends"],
        sort: { age: 1 },
    },
    (err, res) => (err ? console.log("Error:", err) : console.log("Success:", res.results))
);

Vous obtiendrez ainsi des utilisateurs classés par âge et tous les objets amis intégrés.

Comment cela fonctionne-t-il ?

Les coulisses mongo-join-query utilisera votre schéma Mongoose pour déterminer les modèles à joindre et créera un fichier de type pipeline de regroupement qui effectuera la jointure et la requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X