koa中使用mongoose的一个问题

发布于 2022-09-11 23:29:11 字数 1345 浏览 16 评论 0

const mongoose = require('mongoose');

const menu = new mongoose.Schema({
    name:{
        unique:true,
        type:String,
        required:true
    },
    pid:{
        display:'父节点',
        default:0,
        type:mongoose.Schema.Types.Mixed
    },
    displayName:{
        unique:true,
        type:String,
        required:true
    },
    description:{
        type:String,
    },
    children:[] //希望这里是pid=_id的集合
})

module.exports = mongoose.model('Menu',menu)

详细描述

这个表是一个菜单 pid为0 则说明是最顶级的菜单 ,子集菜单的pid为父级的_id 这里children 怎样能返回 菜单的pid为_id的集合即

[
    {
    name:"肉类",
    pid:0,
    _id:"5dc8d37318832f19f45c2b8d",
    children:[{
        name:"猪肉",
        pid:'5dc8d37318832f19f45c2b8d',
        _id:"5dc8d37XXXXXXXd"
        },{
        name:"牛肉",
        pid:'5dc8d37318832f19f45c2b8d',
        _id:"5dc8d373XXXXXX2b8d"
        }]
    },
    {
    name:"猪肉",
    pid:'5dc8d37318832f19f45c2b8d',
    _id:"5dc8d37XXXXXXXd"
    },{
    name:"牛肉",
    pid:'5dc8d37318832f19f45c2b8d',
    _id:"5dc8d373XXXXXX2b8d"
    },
    {
    name:"蔬菜",
    pid:'0',
    _id:"5dc8d373XXXXX222222b8d"
    },
]

能否在表中怎样操作?还是说只能在添加子类的时候再获取父级的pid 再找到父级id 写入children?

希望在数据库中children 不写入数据 但是请求的时候会将children返回 ,因为数据其实在表里都有没必要重复添加吧 请问该如何操作呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦萦几度 2022-09-18 23:29:12

之前看api文档看到处理方法,没试过,看到你这个问题,刚好我也想亲自试下。

graphLookup

一下是我写的完整案例代码,可运行:
index.js

const mongoose = require('mongoose');
const fs = require('fs')
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });
const Menu = mongoose.model('Menu', new mongoose.Schema({
  name: {
    unique: true,
    type: String,
    required: true
  },
  pid: {
    display: '父节点',
    default: 0,
    type: mongoose.Schema.Types.Mixed
  },
}), 'test_menu');

(async function () {
  await Menu.remove({})
  const fa = await new Menu({name: '肉类'}).save()
  await new Menu({name: '猪肉', pid: fa._id}).save()
  await new Menu({name: '羊肉', pid: fa._id}).save()
  const res = await Menu.aggregate([
    {
      $graphLookup: {
        from: "test_menu",
        startWith: "$_id",
        connectFromField: "_id",
        connectToField: "pid",
        as: "gaga"
      }
    }
  ])
  fs.writeFileSync('./res.json', JSON.stringify(res))
  mongoose.disconnect()
}())

输出结果

[
  {
    "_id": "5dcbbe3835605a17a0bb85c2",
    "pid": 0,
    "name": "肉类",
    "__v": 0,
    "gaga": [
      {
        "_id": "5dcbbe3935605a17a0bb85c3",
        "pid": "5dcbbe3835605a17a0bb85c2",
        "name": "猪肉",
        "__v": 0
      },
      {
        "_id": "5dcbbe3935605a17a0bb85c4",
        "pid": "5dcbbe3835605a17a0bb85c2",
        "name": "羊肉",
        "__v": 0
      }
    ]
  },
  {
    "_id": "5dcbbe3935605a17a0bb85c3",
    "pid": "5dcbbe3835605a17a0bb85c2",
    "name": "猪肉",
    "__v": 0,
    "gaga": []
  },
  {
    "_id": "5dcbbe3935605a17a0bb85c4",
    "pid": "5dcbbe3835605a17a0bb85c2",
    "name": "羊肉",
    "__v": 0,
    "gaga": []
  }
]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文