2016-06-08 23 views
15

因此,衆所周知,find()返回一個結果數組,而findOne()只返回一個簡單的對象。如何使用MongoDBs``lookup`作爲`findOne()`

有了Angular,這會產生巨大的差異。而不是去{{myresult[0].name}},我可以簡單地寫{{myresult.name}}

我發現在聚合管道中的$lookup方法返回一個結果數組,而不是僅僅一個對象。

例如,我有兩個colletions:

users集合:

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

countries集合:

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

我總$lookup

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

從查詢結果:

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

正如你可以通過上面的結果看到的,每個country是一個數組,而不是一個單一的對象像"country": {....}

如何讓我的$lookup返回單個對象而不是數組,因爲它只會匹配單個文檔?

回答

18

您幾乎已經在那裏了,您需要將另一個$project階段添加到您的管線中,並使用$arrayElemAt返回陣列中的單個元素。

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 ] } 
     }} 
    ] 
) 
相關問題