我一直在尝试搜索由 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
一起使用吗?
谢谢!
答案 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
] }
},
},
]);