$ lookup localField对数组中特定索引的引用

时间:2017-03-03 22:19:50

标签: arrays mongodb lookup

我有一系列排名。每个排名都有一个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"}
])

但不幸的是,它并没有认识到localField ranks.1的值作为"元组"的第二个元素,而是(不存在)字段{{ 1}}显然,因为它不匹配用户。我的解决方法是首先使用这样的投影(在"ranks.1"之后)提取第一个元素:

$unwind

然后将其用作{$project: { user_id: {$arrayElemAt: ["$ranks", 1]} }}, 。但我想知道是否有更直接的解决方案。

1 个答案:

答案 0 :(得分:1)

来自docs

  

如果你的localField是一个数组,你需要添加$ unwind   进入你的管道。

所以你所做的是正确的推荐方法。