mongodb聚合不匹配自己的id

时间:2016-01-26 17:33:30

标签: mongodb aggregation-framework

两个收藏:

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

0 个答案:

没有答案