mongoose连表查询与更改

mongoose中的连表查询

github地址 population API

当找不到外链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查询一次后更改了