mongoose连表查询与更改

mongoose中的连表查询

github地址
population API

当找不到外链ID会跳过此ID

比如 Name1中有三个_id分别为

1
2
3
{
test:[1,2,3] ref:Name2
}

Name2中以_id来索引表分别为

1
2
3
4
5
6
7
8
9
10
11
12
{
_id:1
name:1
},
{
_id:2
name:2
},
{
_id:3
name:3
}

现在删除Name2中的_id:2但是不删除Name1中的test外键中的_id:2
这样索引出来会索引出_id:1 _id:3并且不会报错.

建立关联表

表一:Name

1
2
3
4
5
6
var ObjectId=mongoose.Schema.Types.ObjectId
var NameSchema=new mongoose.Schema({
name:String,
age:{type:Number,default:18},
classId:[{type:ObjectId,ref:"ClassName"}]
})

表二:ClassName

1
2
3
4
5
6
7
8
var ClassSchema=new mongoose.Schema({
className:{
type:String,
unique:true
},
credit:Number
}
)

表一中有个字段为 classId 其中存储的类型是ObjectId,并且通过ref与ClassName表建立起关系

添加课程数据

1
2
3
4
5
6
7
8
9
10
11
Class=new ClassModel({
className:"数学",
credit:5
})
_Class.save(function(err,doc){console.log(doc)})
_Class=new ClassModel({
className:"语文",
credit:10
})
_Class.save(function(err,doc){console.log(doc)})

添加用户

1
2
3
4
5
6
7
8
9
10
11
12
13
_Name=new NameModel({
name:"小明",
age:20
})
_Name.save(function(err,doc){console.log(doc)})
_Name=new NameModel({
name:"小红",
age:25
})
_Name.save(function(err,doc){console.log(doc)})

为用户添加课程

这里classId需要添加的是ClassName中的_id

1
2
3
4
5
NameModel.findOne({name:"小明"},function(err,doc){
console.log(57,doc)
//语文
doc.classId.push("5678bd800c79fdf00e15b184")
doc.save()})

连表查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
NameModel.findOne({name:"小明"},function(err,doc){
console.log(57,doc)
//语文
doc.classId.push("5678bd800c79fdf00e15b184")
doc.save()
// 连表查询小明选择的课程
NameModel
.findOne({name:"小明"})
.populate("classId")
.exec(function(err,doc){
console.log(69,doc)
/*
* { age: 20,
* classId:
* [ { __v: 0,
* credit: 10,
* className: '语文',
* _id: 5678bd800c79fdf00e15b184 } ],
* __v: 1,
* name: '小明',
* _id: 5678c36088fd47482e1df3de }
*
*
* */
})
});

查询与更改

比如我想要直接更改ClassName中的名字 把语文更改为物理..那么直接population后更改保存时不行的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
NameModel.findOne({name:"小明"},function(err,doc){
console.log(57,doc)
//语文
doc.classId.push("5678bd800c79fdf00e15b184")
doc.save()
// 连表查询小明选择的课程
NameModel
.findOne({name:"小明"})
.populate("classId")
.exec(function(err,doc){
console.log(69,doc)
/*
* { age: 20,
* classId:
* [ { __v: 0,
* credit: 10,
* className: '语文',
* _id: 5678bd800c79fdf00e15b184 } ],
* __v: 1,
* name: '小明',
* _id: 5678c36088fd47482e1df3de }
*
*
* */
doc.classId[0].name="物理"
doc.save()
})
});

更改后保存不会出错,但是,className数据库中的语文并不会更改…
只有用classnamemodel查询一次后更改了