2017-03-03 70 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