new how fields all mongodb mongodb-query aggregation-framework

how - Cómo usar el agregado de $ MongoDBs `lookup` como` findOne() `



project all fields mongodb (2)

También puedes usar "preserveNullAndEmptyArrays"

Al igual que:

db.users.aggregate( [ { "$project": { "fullName": { "$concat": [ "$firstName", " ", "$lastName"] }, "country": "$country" }}, { "$lookup": { "from": "countries", "localField": "country", "foreignField": "_id", "as": "countryInfo" }}, {"$unwind": { "path": "$countryInfo", "preserveNullAndEmptyArrays": true } }, ] )

Entonces, como todos saben, find() devuelve una serie de resultados, con findOne() solo devuelve un objeto simple.

Con Angular, esto hace una gran diferencia. En lugar de ir {{myresult[0].name}} , simplemente puedo escribir {{myresult.name}} .

Descubrí que el método de $lookup en la canalización agregada devuelve una matriz de resultados en lugar de un solo objeto.

Por ejemplo, tengo dos coleciones:

colección de users :

[{ "firstName": "John", "lastName": "Smith", "country": 123 }, { "firstName": "Luke", "lastName": "Jones", "country": 321 }]

colección de countries :

[{ "name": "Australia", "code": "AU", "_id": 123 }, { "name": "New Zealand", "code": "NZ", "_id": 321 }]

Mi $lookup agregada de $lookup :

db.users.aggregate([{ $project: { "fullName": { $concat: ["$firstName", " ", "$lastName"] }, "country": "$country" } }, { $lookup: { from: "countries", localField: "country", foreignField: "_id", as: "country" } }])

Los resultados de la consulta:

[{ "fullName": "John Smith", "country": [{ "name": "Australia", "code": "AU", "_id": 123 }] }, { "fullName": "Luke Jones", "country": [{ "name": "New Zealand", "code": "NZ", "_id": 321 }] }]

Como puede ver por los resultados anteriores, cada country es una matriz en lugar de un solo objeto como "country": {....} .

¿Cómo puedo hacer que mi $lookup devuelva un solo objeto en lugar de una matriz, ya que solo coincidirá con un solo documento?


Ya casi está allí, necesita agregar otra etapa de $project a su canalización y usar $arrayElemAt para devolver el elemento único en la matriz.

db.users.aggregate( [ { "$project": { "fullName": { "$concat": [ "$firstName", " ", "$lastName"] }, "country": "$country" }}, { "$lookup": { "from": "countries", "localField": "country", "foreignField": "_id", "as": "countryInfo" }}, { "$project": { "fullName": 1, "country": 1, "countryInfo": { "$arrayElemAt": [ "$countryInfo", 0 ] } }} ] )