Tengo 2 colecciones.
1. usuario:

{
    "_id": "111",
    ...,
    "type": 1
}

2. consulta:

{
    "_id": {
        "$oid": "58bbf5bf17cc9100046b0dff"
    },
    "query": "some query",
    "user_id": "111",
    "links": []
}

Lo que quiero seleccionar: todas las consultas para algún tipo de usuario especial . Ahora selecciono a todos los usuarios con algún tipo de usuario e incluyo todas sus consultas como un campo; eso no es realmente lo que necesito.

db.collection('user').aggregate([
        {$match : {'type': userType}},
        {$lookup: {from: 'query', localField: '_id', foreignField: 'user_id', as: 'queries'}},
        {$unwind: '$queries'}
    ], function(err, results) {...});

Gracias.

Editar:
Ejemplo: deseo seleccionar todas las consultas para los usuarios con type 1. Entonces, la salida es como:

[{
    "_id": {
        "$oid": "58bbf5bf17cc9100046b0dff"
    },
    "query": "some query",
    "user_id": "111",
    "links": []
},
{
    "_id": {
        "$oid": "58bbf5bf17cc9100046b0dff"
    },
    "query": "some query",
    "user_id": "111",
    "links": []
}]
0
rocknow 7 mar. 2017 a las 06:18

2 respuestas

La mejor respuesta

Sería más fácil lograr esto con 2 consultas distintas:

  1. obtener una lista de usuarios _id que tienen el tipo deseado
  2. obtener todas las consultas donde userId está en la lista

Aquí hay un script de muestra:

// filter users, and push all matching _id in listId field
var cursor = db.user.aggregate([{$match: {type: 1}}, {$group: {_id: null, listId: {$push: "$_id"}}}]);

if (cursor != null && cursor.hasNext()) {
   var listId = cursor.next().listId;

   // find queries where user_id is in listId
   var result = db.query.find({user_id: {$in: listId}});
   if (result != null && result.hasNext()) {
     while (result.hasNext()) {
       print(JSON.stringify(result.next())); 
    }
  }
}

Para ejecutarlo, pegue el código en un archivo llamado script.js, y luego ejecútelo desde su shell

mongo databaseName < script.js
2
felix 7 mar. 2017 a las 06:46

Puedes probar debajo de la agregación.

db.collection('user').aggregate([
        {$match : {'type': userType}},
        {$lookup: {from: 'query', localField: '_id', foreignField: 'user_id', as: 'queries'}},
        {$unwind: '$queries'},
        {$replaceRoot:{newRoot:"$queries"}}
    ]
1
Sagar Veeram 7 mar. 2017 a las 10:41