mongoose 为什么MongoDB $expr不能正常工作?

8ftvxx2r  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(355)
{
    $lookup: {
        from: "follows",
        let: {
            id: "$_id",
        },
        as: "friend",
        pipeline: [
            {
                $match: {
                    $expr: {
                        $or: [
                            {
                                $and: [{ follower: "$$id" }, { following: Types.ObjectId(userId) }],
                            },
                            {
                                $and: [{ follower: Types.ObjectId(userId) }, { following: "$$id" }],
                            },
                        ],
                    },
                },
            },
        ],
    },
}

上面的代码总是返回“Follow”集合中的每一个数据。

$expr: {
  follower: Types.ObjectId(userId),
}

它仍然返回相同的数据!但是这个更简单的查询在没有$expr的情况下也能正常工作。
下面是我的数据库模型和第一次查询的预期结果。

db.follow [
    {
        _id: abc123,
        follower: '1',
        following: '2'
    },
    {
        _id: abc124,
        follower: '2',
        following: '1'
    },
    {
        _id: abc125,
        follower: '3',
        following: '4'
    }
]

result.friend [
    {
        _id: abc123,
        follower: '1',
        following: '2'
    },
    {
        _id: abc124,
        follower: '2',
        following: '1'
    }
]
ss2ws0br

ss2ws0br1#

首先,让我们确定简单查询的目标

$expr: {
  follower: Types.ObjectId(userId),
}

由于$expr不知道如何将数据库属性与提供的ObjectId进行比较,因此此操作不起作用。您应该包含$eq运算符以检查是否相等:

$expr: {
  $eq: [
    "$follower",
    Types.ObjectId(userId)
  ]
}

如果您要检查是否相等,实际上并不需要$expr运算符,但只需将字段和值传递给$match查询,如下所示:

$match: {
  "follower": Types.ObjectId(userId)
}

**提供示例数据后更新:**要根据需要查询数据,您只需使用$or查找满足 * 至少一个 * 条件的匹配文档。

$match: {
  $or: [
    {
      follower: "1"
    },
    {
      following: "1"
    }
  ]
}

相关问题