Tengo este comando en mongo cli, pero no obtengo ningún resultado:
db.files.find({ state: 4, created : { '$gte': ISODate("2017-01-18T00:00:00.000Z"), '$lte': ISODate("2017-01-19T00:00:00.000Z") } }).forEach( function (o) { db.users.find({"id": ObjectId(o.user)},{"username": 1}).pretty(); });¿Cómo saco el nombre de usuario en el cli?
db.users.find({},{'id':1, 'username':1}).pretty(); { "_id" : ObjectId("5489b6abe4b0e66fc6491c85"), "username" : "user@domain.tld" } db.files.find({ }, {'id': 1, 'user': 1} ).pretty(); { "_id" : "--M17HJrR1m1svX6GZS-YQ", "user" : "56bfe199fe6cc47d0c2f8781" } { "_id" : "--bnG8eJTfiYE08xjDphmQ", "user" : "56c477a9da1173ce065abfbf" } { "_id" : "-0G2Q5fQQTCJhqEWjVkQYw", "user" : "57388a9b9ef0e2201245b265" }Al ver que el campo de user en la colección de archivos es una cadena, no ObjectId , debe crear una lista de ObjectId , es decir, asignar las cadenas de identificación de user a una matriz de ObjectId con los que puede consultar la colección de users .
Por ejemplo, lo siguiente usa el método distinct() con un segundo argumento de consulta en ambas colecciones para producir matrices con las que puede consultar las referencias. Los resultados finales se imprimirán para consolar los nombres de usernames :
var userIds = db.files.distinct("user", { "state": 4, "created" : { "$gte": ISODate("2017-01-18T00:00:00.000Z"), "$lte": ISODate("2017-01-19T00:00:00.000Z") } }).map(function(id) { return ObjectId(id); } ); db.users.distinct("username", {"_id": { "$in": userIds } }).forEach(printjson); Si el campo de usuario es un ObjectId , utilice el operador $lookup del marco de agregación de la siguiente manera:
db.files.aggregate([ { "$match": { "state": 4, "created": { "$gte": ISODate("2017-01-18T00:00:00.000Z"), "$lte": ISODate("2017-01-19T00:00:00.000Z") } } }, { "$lookup": { "from": "users", "localField": "user", "foreignField": "_id", "as": "userList" } }, { "$project": { "user": { "$arrayElemAt": ["$userList", 0] } } }, { "$project": { "username": "$user.username" } } ]).map(function(doc) { return doc.username; }).forEach(printjson);¿No debería ser "_id" en lugar de "id"?
db.files.find({ state: 4, created : { '$gte': ISODate("2017-01-18T00:00:00.000Z"), '$lte': ISODate("2017-01-19T00:00:00.000Z") } }).forEach( function (o) { db.users.find({"_id": ObjectId(o.user)},{"username": 1}).pretty(); });También creo que puede obtener toda la identificación y luego llamar a los operadores también
var userIds = []; db.files.find({ state: 4, created : { '$gte': ISODate("2017-01-18T00:00:00.000Z"), '$lte': ISODate("2017-01-19T00:00:00.000Z") } },{user:1}).forEach( function (o) { userIds.push(new ObjectId(o.user)); }); db.users.find({"_id": {$in : userIds},{"username": 1}).pretty();PD: el enfoque de Chridam es más favorable que cualquiera de estos.