【问题标题】:Mongoose: Querying related object with parametersMongoose:使用参数查询相关对象
【发布时间】:2021-01-16 04:02:43
【问题描述】:

假设我有一系列相互关联的对象,如下所示:每个对象A-type 都有字段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 对象?

例如:仅获取具有some 字段的A-type 实例包含lorem 并且与B-type 对象相关且name 包含ipsum

P.S.我尝试过这样的事情:

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

...但它不起作用。

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

【问题讨论】:

  • 你能确认b对象是否有自己的集合还是保存在同一个A集合中?
  • 你好,汤姆。不好意思,等了两天才回复。是的,我收集了 a-items 和 b-items。它们是相应模型的实例 - AB。并且A 模型的每个实例都有一个b 模型实例的ID。

标签: node.js database mongodb mongoose strapi


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 2014-05-13
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2019-10-05
    • 2020-04-15
    相关资源
    最近更新 更多