如何使用mongoose查找子文档?

3

抱歉,我的英语不好...

如何使用mongoose查找子匹配?

我的查询是

categorys.aggregate([{
            "$sort": {
                "order": 1,
                "id": 1
            }
        },

        {
            "$lookup": {
                "localField": "id",
                "from": "categorys",
                "foreignField": "parentId",
                "as": "child"
            }
        },
        {
            "$match": {
                see: true,
                depth: 1
            }
        }
    ]).exec(function(err, Categorys)

结果如下

{
    "_id": "596e237c414f2137b0c4e9c2",
    "id": 3,
    "name": "DB",
    "address": "DB",
    "parentId": 0,
    "depth": 1,
    "see": true,
    "__v": 0,
    "child": [{
            "_id": "596e24701e1bd30dc415b894",
            "id": 5,
            "name": "Mongodb",
            "address": "Mongodb",
            "parentId": 3,
            "depth": 2,
            "see": true,
            "__v": 0
        },
        {
            "_id": "596e24821e1bd30dc415b895",
            "id": 6,
            "name": "mssql",
            "address": "mssql",
            "parentId": 3,
            "depth": 2,
            "see": false,
            "__v": 0
        }
    ]
}]

我在 MSSQL 中没有找到结果(see:false),这是怎么回事?请帮忙!


你似乎正在寻找一个“自连接”,虽然你可以使用$lookup,但这可能不是最好的选择。实际上,你似乎在询问类似于Aggregation filter after $lookup的问题,尽管标题如此,但实际上它本身就是关于“自连接”的。而不同的方法在答案中有所解释。 - Neil Lunn
好的,我会检查的,非常感谢。 - young
1个回答

2

如果你想在child数组中匹配,可以在$project阶段使用$filter,如下所示。

categorys.aggregate([
  {
    "$sort": {
      "order": 1,
      "id": 1
    }
  },
  {
    "$lookup": {
      "localField": "id",
      "from": "categorys",
      "foreignField": "parentId",
      "as": "child"
    }
  },
  {
    $project: {
      name: 1,
      address: 1,
      // ... as you need 
      child: {
        $filter: {
          input: "$child",
          as: "item",
          cond: {
            $and: [
              {$eq: ["$$item.see", true]},
              {$eq: ["$$item.depth", 2]}
            ]
          }
        }
      }
    }
  }
])

注意: 如果您想对父字段使用匹配条件,例如 "depth":1,"see":true,,那么您应该在$lookup之前使用$match阶段。
categorys.aggregate([
  {$match:{//parent field match condition first}},
  {$sort:{}},
  {$lookup:{}},
  {$project:{//for child}}
]);

好的,我知道了,非常感谢。 - young
实际上,这正是我试图通过告诉他们不要那样做来帮助OP的。您不需要“加入”相同的集合。这真的很低效和不必要。 - Neil Lunn
好的!感谢您在学习方面的建议。 - young
我们如何在不使用join的情况下获取child数组?您能否发布您的答案或任何参考资料,以便我们学习。@NeilLunn - Shaishab Roy
我已经有了这个答案。但是没有将其标记为重复,因为不清楚OP的问题。但现在很明显它实际上是同样的事情。 - Neil Lunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接