2017-03-03 71 views
0

我有一個排名集合。每個排名都有一個3元組(列表)[rank, user_id, score]的數組。一個單一的文件可能看起來像這樣:

{ 
    "_id" : 33691, 
    "timestamp" : ISODate("2017-03-03T01:29:31.663Z"), 
    "ranks" : [ 
     [1, 53982363, 13666235], 
     [2, 26204263, 5544911], 
    ] 
} 

現在我要上擁有完全用戶數據,而不只是一個用戶ID行列視圖,基本上是一個與我users收藏加入。我的查詢是這樣的:

db.getCollection('pokeyen_bet_rankings').aggregate([ 
    {$match: {_id: 33691}}, 
    {$unwind: "$ranks"}, 
    {$lookup: { 
     from: "users", 
     localField: "ranks.1", 
     foreignField: "_id", 
     as: "user" 
    }}, 
    {$unwind: "$user"} 
]) 

不過遺憾的是它並沒有爲ranks.1爲「元組」的第二個元素localField承認的價值,而是(不存在的)領域"ranks.1"明顯,因爲它不」不符合用戶。我的解決辦法是用一個突起的第一像這樣(在$unwind後)提取第一個元素:

{$project: { 
    user_id: {$arrayElemAt: ["$ranks", 1]} 
}}, 

,然後使用該作爲localField。但我想知道是否有更直接的解決方案。

回答

1

docs

如果您localField是一個數組,你需要一個$放鬆 階段添加到您的管道。

所以你所做的是正確的推薦方法。

+0

我相信這個文檔引用了像[這裏](https://jira.mongodb.org/browse/SERVER-22881)中描述的ID數組,而不是像元組的數組。從這個意義上說,我確實需要'$ unwind'階段 – Felk

+0

您確實需要'$ unwind'階段,但在$'unwind'之後沒有匹配的結構,它應該是本地字段或本地字段ID的數組。你在jira ticket中提到的ID的數組,但那些不是'UserIds'。其他的東西'輸入文檔中的'localField:<字段>'只需要字段名稱,所以你不能傳遞計算的屬性或表達式。 – Veeram

+0

好的,謝謝。那麼我會堅持投影 – Felk