NodeJs操作MongoDB之多表查询($lookup)与常见问题

    技术2022-07-11  73

    1. 例子

    2个表, 一个类目表(cates), 一个食品表(foods), ps: 注意 这是表名字都是有s的, 就算没有写,mongodb 是自动添加的。

    db.cates.insert({"_id":1,"title":"热菜"}) db.cates.insert({"_id":2,"title":"冷菜"}) db.foods.insert({"_id":1,"cate_id":1,"title":"红烧肉", "price":5}) db.foods.insert({"_id":2,"cate_id":2,"title":"凉拌黄瓜", "price":25}) db.foods.insert({"_id":3,"cate_id":2,"title":"皮蛋豆腐", "price":15}) db.foods.insert({"_id":4,"cate_id":1,"title":"酱猪蹄", "price":25}) db.cates.find() db.foods.find()

    希望实现的结果:

    [{ title: '热菜', id: 1, list: [{ title: '红烧肉', id: 1, }, { title: '酱猪蹄', id: 4, } ] }, { title: '冷菜', id: 2, list: [{ title: '凉拌黄瓜', id: 2, }, { title: '皮蛋豆腐', id: 3, } ] } ]

    方案:

    localField 与 localField 通过哪一个键来相互关联的。

    await cates.aggregate([{ $lookup: { from: 'foods', // 需要去查询哪一个表 localField: '_id', // cates 的key 名字 foreignField: 'cate_id', // foods的 key as: 'list' // alias 别名 } } ])

    2. 注意事项:

    aggregate from 的是名字 有 s 的。localField 与 foreignField 的都是Object的 类型,如果一个 string ,一个是Object 那就关联不上了

    3. 进阶

    1.返回结果需要过滤参数 await cates.aggregate([{ $lookup: { from: 'foods', localField: '_id', foreignField: 'cate_id', as: 'list' } }, { "$project": { "_id": 1, // 1 代表返回, 0 代表不返回 "title": 1, "list._id": 1, "list.title": 1, "list.price": 1, } }])
    Processed: 0.012, SQL: 9