2016-06-08 26 views
15

Come tutti sapete, find() restituisce una serie di risultati, con findOne() restituire solo un oggetto semplice.

Con Angolare, questo fa un'enorme differenza. Invece di andare a {{myresult[0].name}}, posso semplicemente scrivere {{myresult.name}}.

Ho trovato che il metodo $lookup nella pipeline aggregata restituisce una matrice di risultati anziché solo un singolo oggetto.

Per esempio, ho due colletions:

users collezione:

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

countries collezione:

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

mio aggregato $lookup:

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

I risultati della query:

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

Come si può vedere dai risultati di cui sopra, ogni country è un array invece di un singolo oggetto come "country": {....}.

Come posso avere il mio $lookup restituire un singolo oggetto invece di un array poiché corrisponderà sempre solo a un singolo documento?

risposta

18

Ci sei quasi, è necessario aggiungere un altro stage $project alla pipeline e utilizzare $arrayElemAt per restituire il singolo elemento nell'array.

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