两个收藏:
A {_id: ObjectId("5374f3e20ac993835f0001c0"), idsOfB: [...]}
B {_id: ObjectId("5374f3e20ac993835f000aaa"), a: ObjectId("5374f3e20ac993835f0001c0")}
我想要的就是加入这两个系列。它应该给我所有未在A。数组中列出的B条目。
db.getCollection('B').aggregate([
{$match: {a: ObjectId("5374f3e20ac993835f0001c0")}},
{
$lookup:{
from: "A",
localField: 'a',
foreignField: "_id",
as: "_a"
}
},
{$unwind: '$_a'},
{$match:{'_a.idsOfB':{$nin: ['$_id']}}
}
])
此查询不起作用。如果B的id列在A.idsOfB中,它每次都会发送,没有。所以我确信它正在服用' $ _ id'作为字符串而不是将其解析为自己的id。 $ sign似乎不适用于那里。
但是,如果我改变匹配......
{$match:{'_a.idsOfB':{$nin: [ObjectId("5374f3e20ac993835f0001c0")]}}
......工作正常。
但我需要自动排除它们。我不想在第二场比赛中查询所有已经列出的B中的B,就像有很多。
我在第一场比赛中做错了什么?
无需查询即可轻松完成:
tmpStuff
{
"_id" : ObjectId("56a88fa0894c9c780f79f30f"),
"listOfStuff" : [
"stuffA"
],
"stuffType" : "stuffA"
}
这不起作用,不管我在$ in参数中写的是什么:
db.getCollection('tmpStuff').aggregate([
{$match: {'stuffType': {$in: ['$listOfStuff']}}}
])
这很好用,但我必须列出所有可能的$ in参数列表:
db.getCollection('tmpStuff').aggregate([
{$match: {'stuffType': {$in: ['stuffA']}}}
])
有没有办法在$ in?
中引用自己的属性listOfStuff