如何在特定条件下执行查找

时间:2017-11-25 17:11:36

标签: mongodb

MongoDb是否可以执行查找,但仅限于某些条件?我需要从我的MongoDb获取事件,并且只有当事件有某个用户添加了相关的赌注时 - 我想在集合中添加赌注。

首先,我使用Match运算符和$ lookup来获取与事件相关的投注,但问题是我需要定义第二个条件 - 投注的用户标识符必须与外部参数(userId)的值相同。 / p>

然后我只需要添加一个结果,而不是一个集合 - 这就是我使用$ project的原因。请帮忙。

我的代码在这里:

            db.collection('events').aggregate([
                {
                    $match: {
                        'isDeleted': false,
                        'leagueId': ObjectID(leagueId)
                    }
                },
                {
                    $lookup: {
                        from: "bets",
                        localField: "_id",
                        foreignField: "eventId",
                        as: "bets"
                    },
                },
                { 
                    $project: { 
                        _id: true,
                        home: true,
                        guest: true,
                        description: true,
                        result: true,
                        resultHome: true,
                        resultGuest: true,
                        startDate: true,
                        type: true,
                        specialPoints: true,
                        leagueStage: true,
                        createdDate: true,
                        updatedDate: true,
                        isDeleted: true,
                        isCalculated: true,
                        leagueId: true,
                        bet: { "$arrayElemAt": [ "$bets", 0 ] } 
                }
            }

1 个答案:

答案 0 :(得分:1)

不,你在$lookup中没有条件。但是你可以做到以下几点。 查找后,您有一个bets数组。您可以使用$unwind。 这样,您可以平面表示阵列。这意味着如果您有一个包含两个数组条目的文档,那么将创建两个具有相同字段和名称的文档,只有该数组才会有所不同。

然后,您可以再次使用$match过滤掉您想要的那个。那么除非你想修改你的文件,否则你不需要使用$project

所以你的聚合管道看起来像这样:

db.getCollection('events').aggregate([{
        $match: {
            'isDeleted': false,
            'leagueId': ObjectID(leagueId)
        }
    },
    {
        $lookup: {
            from: "bets",
            localField: "_id",
            foreignField: "eventId",
            as: "bets"
        },
    },
    {
        $unwind: "$bets"
    },
    {
        // match here again to only get the bet you need
    }
])

希望它有所帮助。