{
$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'
}
]
1条答案
按热度按时间ss2ws0br1#
首先,让我们确定简单查询的目标
由于
$expr
不知道如何将数据库属性与提供的ObjectId进行比较,因此此操作不起作用。您应该包含$eq
运算符以检查是否相等:如果您要检查是否相等,实际上并不需要
$expr
运算符,但只需将字段和值传递给$match
查询,如下所示:**提供示例数据后更新:**要根据需要查询数据,您只需使用
$or
查找满足 * 至少一个 * 条件的匹配文档。