mongoose连表查询与更改
mongoose中的连表查询
当找不到外链ID会跳过此ID
比如 Name1中有三个_id分别为
{
test:[1,2,3] ref:Name2
}
Name2中以_id来索引表分别为
{
_id:1
name:1
},
{
_id:2
name:2
},
{
_id:3
name:3
}
现在删除Name2中的_id:2但是不删除Name1中的test外键中的_id:2这样索引出来会索引出_id:1 _id:3并且不会报错.
建立关联表
表一:Name
var ObjectId=mongoose.Schema.Types.ObjectId
var NameSchema=new mongoose.Schema({
name:String,
age:{type:Number,default:18},
classId:[{type:ObjectId,ref:"ClassName"}]
})
表二:ClassName
var ClassSchema=new mongoose.Schema({
className:{
type:String,
unique:true
},
credit:Number
}
)
表一中有个字段为 classId 其中存储的类型是ObjectId,并且通过ref与ClassName表建立起关系
添加课程数据
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)})
添加用户
_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
NameModel.findOne({name:"小明"},function(err,doc){
console.log(57,doc)
//语文
doc.classId.push("5678bd800c79fdf00e15b184")
doc.save()})
连表查询
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后更改保存时不行的
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查询一次后更改了