Cómo unirse a la consulta en mongodb?

Tengo una colección de documentos de usuario, como esta:

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

algunos usuarios tienen muchos amigos (10000) , ¿Cómo puedo hacer en SQL?

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

Me gustaría tener solo una consulta, pero no sé si es posible.

Gracias

No puedes hacer lo que quieras en una sola consulta. En primer lugar, debe recuperar la lista de ID de usuario amigo, luego pasar esos ID a la segunda consulta para recuperar los documentos y ordenarlos por edad.

 var user = db.user.findOne({"id" : "001"}, {"friends": 1}) db.user.find( {"id" : {$in : user.friends }}).sort("age" : 1); 

Para tener todo con solo una consulta usando la característica $ lookup del marco de agregación, intente esto:

 db.User.aggregate( [ // First step is to extract the "friends" field to work with the values { $unwind: "$friends" }, // Lookup all the linked friends from the User collection { $lookup: { from: "User", localField: "friends", foreignField: "_id", as: "friendsData" } }, // Sort the results by age { $sort: { 'friendsData.age': 1 } }, // Get the results into a single array { $unwind: "$friendsData" }, // Group the friends by user id { $group: { _id: "$_id", friends: { $push: "$friends" }, friendsData: { $push: "$friendsData" } } } ] ) 

Digamos que el contenido de su colección de usuarios es el siguiente:

 { "_id" : ObjectId("573b09e6322304d5e7c6256e"), "name" : "John", "age" : 30, "friends" : [ "userId1", "userId2", "userId3" ] } { "_id" : "userId1", "name" : "Derek", "age" : 34 } { "_id" : "userId2", "name" : "Homer", "age" : 44 } { "_id" : "userId3", "name" : "Bobby", "age" : 12 } 

El resultado de la consulta será:

 { "_id" : ObjectId("573b09e6322304d5e7c6256e"), "friends" : [ "userId3", "userId1", "userId2" ], "friendsData" : [ { "_id" : "userId3", "name" : "Bobby", "age" : 12 }, { "_id" : "userId1", "name" : "Derek", "age" : 34 }, { "_id" : "userId2", "name" : "Homer", "age" : 44 } ] } 

https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/

Esta es la consulta de doc for join en mongodb, esta es una nueva característica de la versión 3.2.

Entonces esto será útil.

MongoDB no tiene combinaciones, pero en su caso puede hacer:

 db.coll.find({friends: userId}).sort({age: -1}) 

Parece que nadie habló sobre esta opción de usar Pivot además de MapReduce. Hay un buen artículo que podría ser tu respuesta aquí http://cookbook.mongodb.org/patterns/pivot/ Espero que esto te ayude en tus proyectos

un tipo de combinación de una consulta en mongoDB, es solicitar en una colección el id que coincida, poner identificadores en una lista (idlist) y encontrar el uso en otra (o misma) colección con $ in: idlist

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

Puede usar playOrm para hacer lo que quiera en una consulta (con SQL escalable de S-SQL).

 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 } } ); 

esto funciona para mi.

Puedes hacerlo de una vez usando mongo-join-query . Así es como se vería:

 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)) ); 

El resultado tendrá sus usuarios ordenados por edad y todos los objetos de los amigos incrustados.

¿Como funciona?

Detrás de las escenas, mongo-join-query usará su esquema de Mongoose para determinar qué modelos unir y creará una canalización de agregación que realizará la combinación y la consulta.

Solo rellene los amigos de la matriz.

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

El resultado es el mismo así:

 { "_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 } ] } 

Lo mismo que esto: Mangosta: usa Poblar en una matriz de ID de objeto

    Intereting Posts