MongoDB聚合$ elemMatch-在对象数组中搜索变量的ObjectId

时间:2018-12-14 11:11:19

标签: mongodb aggregate

我一直在尝试搜索由 Objects 组成的 Array 数组,该对象是存储在可变。这是通过 $ elemMatch 进行的,因为我还有其他一些条件。

这是一个简化的示例,因此每个人都可以理解问题。 这是测试数据:

{
    _id: ObjectId('b00000000000000000000101'),
    friends: [
        {
            friend: ObjectId("b00000000000000000000201"),
            level: 5
        },
        {
            friend: ObjectId("b00000000000000000000202"),
            level: 3
        },
        {
            friend: ObjectId("b00000000000000000000203"),
            level: 8
        }
    ]
}

这是不起作用的查询:

db.test.aggregate([
    {
        $addFields: {
            __testFriend: ObjectId("b00000000000000000000202"),
        },
    },
    {
        $match: {
            friends: {
                $elemMatch: {
                    friend: '$__testFriend',
                    level: { $gte: 3 },
                },
            },
        },
    },
]);

这是工作且没有变量且带有硬ObjectId的相同查询:

db.test.aggregate([
    {
        $addFields: {
            __testFriend: ObjectId("b00000000000000000000202"),
        },
    },
    {
        $match: {
            friends: {
                $elemMatch: {
                    friend: ObjectId("b00000000000000000000202"),
                    level: { $gte: 3 },
                },
            },
        },
    },
]);

有人可以向我解释如何使我的查询与变量$__testFriend一起使用吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在$ match中使用$expr运算符:

db.test.aggregate([
    {
        $addFields: {
            __testFriend: ObjectId("b00000000000000000000202")
        },
    },
    {
        $match: { $expr: {
            $gt: [ { $size: { $filter: {
                   input: "$friends",
                   as: "one",
                   cond: { $and: [ 
                       { $eq: [ "$$one.friend", "$__testFriend" ] },
                       { $gte: [ "$$one.level", 3 ] }
                   ] }
                } } },
                0
            ] }
        },
    },
]);