猫鼬:使用参数查询相关对象

时间:2020-09-30 13:09:23

标签: node.js database mongodb mongoose strapi

想象一下,我有一系列彼此相关的对象,如下所示:每个对象A-类型都有一个字段b,其中包含对象B-type的某些实例的ID

// example of A type
const a = {
  some: 'blablabla',
  b: ObjectId('...')
};

// example of B type
const b = {
  name: 'bla',
  surname: 'blabla'
}

问题:那么,如何仅获得其中字段A包含b对象和具有特殊值的字段的B-type类型实例? / p>

例如:仅获取A类型的实例,这些实例的字段some包含lorem,并且与B类型的对象相关,其中name包含ipsum

PS 。我已经尝试过类似的操作:

A.find({ some: 'lorem', 'b.name': 'ipsum' });

...但是它不起作用。

P.P.S。。我根本不是后端开发人员。但我别无选择:)

1 个答案:

答案 0 :(得分:0)

您要使用的是$lookup(如果知道的话,它等效于join的sql)。来“加入”这两个集合。那么您可以像这样查询两个对象:

db.a.aggregate([
  {
    $match: {
      some: "lorem"
    }
  },
  {
    "$lookup": {
      "from": "b",
      "let": {
        "bId": "$b"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$$bId",
                    "$_id"
                  ]
                },
                {
                  $eq: [
                    "$name",
                    "ipsum"
                  ]
                }
              ]
            }
          }
        }
      ],
      "as": "B"
    }
  },
  {
    $match: {
      "B.0": {
        $exists: true
      }
    }
  }
])

Mongo Playground