2016-06-08 27 views
15

Powoduje, że wszyscy wiedzą, że find() zwraca tablicę wyników, zwracając po prostu prosty obiekt z findOne().

Z Angular, robi wielką różnicę. Zamiast iść na {{myresult[0].name}}, mogę po prostu napisać {{myresult.name}}.

Odkryłem, że metoda $lookup w potoku zbiorczym zwraca tablicę wyników zamiast pojedynczego obiektu.

Na przykład, mam dwie colletions:

users kolekcja:

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

countries kolekcja:

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

My kruszywo $lookup:

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

Wyniki zapytania:

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

Jak widać w powyższych wyników, każdy country jest tablicą zamiast pojedynczego obiektu jak "country": {....}.

W jaki sposób mogę nakazać, aby mój $lookup zwrócił pojedynczy obiekt zamiast tablicy, ponieważ będzie on pasował tylko do jednego dokumentu?

Odpowiedz

18

Już prawie jesteś, musisz dodać kolejny etap $project do swojego potoku i użyć $arrayElemAt, aby zwrócić pojedynczy element w tablicy.

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