素材牛VIP会员
node.js + mongodb建表问题
 最***哥  分类:Node.js  人气:827  回帖:2  发布于6年前 收藏

我在做一个API接口管理系统,第一次用node+mongodb遇到了些问题,特此请教大家。

问题是这样的。API可以分组。比如A B C三个组。每个组下面有不同的请求。我存储的时候是A B C 存储在Cat collection中 各个请求名称存储在ReqName collection中。其中ReqName中有个catId的DbRef指向A B C。来判断这个请求所属的组。现在问题来了 我想读取组的时候就把组下面的请求都读出来,在node中怎么操作?谢谢!

 标签:mongodbnode.js

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv2 入门
jh***23 Web前端工程师 6年前#1

我也刚开始接触mongodb,感觉你上边这种设计方法是典型的结构化数据库的那一套,不适合monogodb的。

坐等高人来解答:)

Lv7 码师
亡***师 JS工程师 6年前#2

根据你在评论中回复我的例子,你不应该把学生和班级分开来,MongoDB的做法不是这样的。
我来举个栗子吧。

Classes Collection

[{
    class: 1,    
    grade: 4,
    students: [{
        name: '小湿',
        sex: '男'
    }, {
        name: '中湿',
        sex: '男'
    }]
}, {
    class: 2,
    grade: 4,
    students: [{
        name: '王尼玛',
        sex: '男'
    }, {
        name: '王泥煤',
        sex: '女'
    }]
}]

你应该把学生们作为一个数组,聚合在班级collection中。

操作

我以MongoDB shell为例。

获取学生

var classes = db.classes.find();

classes.forEach(function (class) {
    var students = class.students;

    console.log(students[0].name); // 小湿,王尼玛
    console.log(students[1].name); // 中湿,王泥煤
});

添加学生

db.classes.update({class: 1}, {$push: {name: '李尼玛', sex: '男'}});

//addToSet可以避免重复插入,下面这条语句执行之后不会插入,因为已经有了一个李尼玛
db.classes.update({class: 1}, {$addToSet: {name: '李尼玛', sex: '男'}});

var classOne = db.classes.find({class: 1});
console.log(classOne.students[2].name); // 李尼玛

修改学生

//修改某个位置的学生的名字
db.classes.update({class: 1}, {$set: {"students.0.name": '我不是小湿'}});

//修改某个匹配的学生的名字
db.classes.update({class: 1, "students.name": '我不是小湿'}, 
        {$set: {"students.$.name": '其实我还是小湿'}});

删除学生

//删除最后一个元素,也就是'中湿'。若key为-1,则删除自一个元素'小湿'
db.classes.update({class: 1}, {$pop: {key: 1}});

//pull会删除所有的匹配元素,如果有两个同名的“王尼玛”,他们都会被删除
db.classes.update({class: 2}, {$pull: {"students.name": '王尼玛'}});

one more thing, 为什么collection是动态的,还需要分门别类?

集合是动态模式的。这意味着一个集合里面的文档可以是各式各样的。例如,下面两个文档可以存储在同一个集合里面:

{"greeting": "Hello world!"}
{"foo": 5}

需要注意的是,上面的文档不光值的类型不同(一个字符串一个整数),它们的键也完全不同。因为集合里面可以放置任何文档,随之而来的一个问题是:还有必要使用多个集合吗?这的确值得思考:既然没有必要区分不同类型文档的模式,为什么还要使用多个集合呢?这里有几个重要的原因。

  • 如果把各种各样的文档不加区分地放在同一个集合里,无论对开发者还是管理员来说都将是噩梦。开发者要么确保每次查询只返回特定类型地文档,要么让执行查询的应用来处理所有不同类型的文档。如果查询博客文章时还要剔除含有作者数据的文档,这会带来很大困扰。
  • 在一个集合里查询特定类型的文档在速度上也很不划算,分开查询多个集合要快得多。例如,假设集合里面一个名为“type”的字段用于指明文档是skim、whole还是chunkey monkey。那么,如果从一个集合中查询这三种类型的文档,速度会很慢。但如果将这三种不同类型的文档拆分为三个不同的集合,每次只需要查询相应的集合,速度快得多。
  • 把同种类型的文档放在一个集合里,数据会更加集中。从一个只包含博客文章的集合里查询几篇文章,或者从同时包含文章数据和作者数据的集合里查出几篇文章,相比之下,前者需要的磁盘寻道操作更少。
  • 创建索引时,需要使用文档的附加结构(特别是创建唯一索引时)。索引是按照集合来定义的。在一个集合中只放入一种类型的文档,可以更有效地对集合进行索引。

上面这些重要原因促使我们创建一个模式,把相关类型的文档组织在一起,尽管MongoDB对此并没有强制要求。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取