Como juntar consulta no mongodb?

Eu tenho a coleção de documentos do usuário, assim:

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

algum usuário tem muitos amigos (10000) , como posso fazer no SQL:

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

Eu gostaria de ter apenas uma consulta, mas eu não sei se é possível.

obrigado

Você não pode fazer o que quiser em apenas uma consulta. Você precisaria primeiro recuperar a lista de IDs de usuários de amigos, depois passar esses ids para a segunda consulta para recuperar os documentos e classificá-los por idade.

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

Para ter tudo com apenas uma consulta usando o recurso $ lookup do framework de agregação, tente isto:

 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 o conteúdo da sua coleção de usuários seja o seguinte:

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

O resultado da 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/

Este é o documento para consulta de junit no mongodb, este é um novo recurso da versão 3.2.

Então isso será útil.

O MongoDB não tem associações, mas no seu caso você pode fazer:

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

Parece que ninguém falou sobre essa opção de usar o Pivot em adição ao MapReduce. Há um bom artigo que poderia ser sua resposta aqui http://cookbook.mongodb.org/patterns/pivot/ Espero que isso ajude você em seus projetos

um tipo de junit de uma consulta no mongoDB, é perguntar em uma coleção por id que corresponde, colocar ids em uma lista (idlist) e encontrar usando em outra (ou mesmo) coleção com $ in: idlist

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

Você pode usar o playOrm para fazer o que quiser em uma consulta (com S-SQL Scalable 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 } } ); 

funciona para mim.

Você pode fazer isso de uma só vez usando mongo-join-query . Aqui está como ficaria:

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

O resultado terá seus usuários ordenados por idade e todos os objects de amigos incorporados.

Como funciona?

Nos bastidores, mongo-join-query usará seu esquema Mongoose para determinar quais modelos serão incluídos e criará um pipeline de agregação que executará a junit e a consulta.

Apenas preencha os amigos da matriz.

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

Resultado é o mesmo assim:

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

O mesmo: Mongoose – usando Populate em um array de ObjectId

    Intereting Posts