按猫鼬中的孙子属性过滤

Posted

技术标签:

【中文标题】按猫鼬中的孙子属性过滤【英文标题】:Filtering By Grandchild property in mongoose 【发布时间】:2021-12-23 02:36:21 【问题描述】:

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

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

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")
,]

【问题讨论】:

【参考方案1】:

我在任何人反应之前就找到了答案……

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"
    
  
])

【讨论】:

以上是关于按猫鼬中的孙子属性过滤的主要内容,如果未能解决你的问题,请参考以下文章

如何通过猫鼬中的嵌套属性查找

一次更新猫鼬中的多个文档

猫鼬中的虚拟对象,“this”是空对象

在猫鼬中,如何根据当前结果过滤搜索结果?

猫鼬中的 findByIdAndRemove 和 findByIdAndDelete 有啥区别?

猫鼬中的 findOne 子文档