首页 > 解决方案 > 按猫鼬中的孙子属性过滤

问题描述

我对猫鼬很陌生,我想知道是否可以根据孙子属性进行过滤。我到处寻找,但我无法根据我正在尝试做的事情找到类似的问题。这是场景:

想象一下,我有一个这样的数据库:

db={
  "parents": [
    {
      "_id": ObjectId("5a834e000102030405000000"),
      "child": ObjectId("5a934e000102030405000000")
    },
    {
      "_id": ObjectId("5a834e000102030405000001"),
      "child": ObjectId("5a934e000102030405000001")
    },
    {
      "_id": ObjectId("5a834e000102030405000002"),
      "child": ObjectId("5a934e000102030405000002")
    },
    
  ],
  "children": [
    {
      "_id": ObjectId("5a934e000102030405000000"),
      "grandchild": ObjectId("5a734e000102030405000000")
    },
    {
      "_id": ObjectId("5a934e000102030405000001"),
      "grandchild": ObjectId("5a734e000102030405000001")
    },
    {
      "_id": ObjectId("5a934e000102030405000002"),
      "grandchild": ObjectId("5a734e000102030405000002")
    }
  ],
  "grandchildren": [
    {
      "_id": ObjectId("5a734e000102030405000000"),
      "name": "grandchild1"
    },
    {
      "_id": ObjectId("5a734e000102030405000001"),
      "name": "grandchild2"
    },
    {
      "_id": ObjectId("5a734e000102030405000002"),
      "name": "grandchild3"
    }
  ]
}

我想返回所有有一个孙子名字为“grandchild1”的父母。

类似的东西

$match: {
      "child.grandchild.name": "grandchild1"
    }

所以只有这个父级会在结果中返回——

[{
  "_id": ObjectId("5a834e000102030405000000"),
  "child": ObjectId("5a934e000102030405000000")
},]

标签: node.jsmongodbmongooseaggregation-framework

解决方案


在有人回答之前我找到了答案...

https://mongoplayground.net/p/w1kw58PzCyk

db.parents.aggregate([
  {
    $lookup: {
      from: "children",
      localField: "child",
      foreignField: "_id",
      as: "child",
      
    }
  },
  {
    $addFields: {
      child: {
        $arrayElemAt: [
          "$child",
          0
        ]
      }
    }
  },
  {
    "$lookup": {
      from: "grandchildren",
      localField: "child.grandchild",
      foreignField: "_id",
      as: "grandchild",
      
    }
  },
  {
    $addFields: {
      grandchild: {
        $arrayElemAt: [
          "$grandchild",
          0
        ]
      }
    }
  },
  {
    $match: {
      "grandchild.name": "grandchild1"
    }
  }
])

推荐阅读