/**********     用户表                BY  Jaysir         2015.6.21
***********
*********** 可搜索以下关键词来查看未实现功能
***********
*********** TODO : 未完成
*********** DONE : 已完成
*********** TOTEST : 待测试
*********** NOTEST : 无需测试
*********** WAITING : 功能待定
***********
*********** 接口: (暂未实现 增加分组,更改好友分组等功能)
*********** findOneByEmail (email ,callback) ;
*********** addFriend (myEmail,otherEmail,callback);
*********** delFriend (myEmail,otherEmail,callback);
*********** getFriendList (email , callback);
*********** regInitData (options , callback);
*********** updateInf (options , callback);
***********/
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userModel = mongoose.model('users', UserSchema); //
// 定义用户表结构
var UserSchema = new Schema({
user_email : {type : String , required : true},
user_password : {type : String , required : true},
user_nickname : {type : String , required : true},
user_sex : {type : String , required : true,enum:['男','女']},
user_pic : {type : String , required : true}, user_friend_groups:[
{
g_name : String,
g_sort : Number,
list : [
{
friend : {type:Schema.Types.ObjectId,ref:'users'}, // 引用users表 查询时可以解引用即为用户的好友列表
remark : {type:String}
}
]
}
],
user_reg_time : {type : Date , required : false}
}); // DONE NOTEST
UserSchema.statics.findOneByEmail = function(email, callback) {
this.findOne({user_email:email}, callback);
}; //添加好友 DONE, TOTEST //查询代码(以下几行注释为命令行下测试代码)mongo命令行下已测试
// db.users.update({user_email:"jaysir@163.com","user_friend_groups.g_sort":1}, //user_email,g_sort需存在
// {"$push": {
// "user_friend_groups.$.list":{
// friend : {
// "$ref" : "users",
// "$id" : ObjectId("55867dd74389afa216e60fad")
// },
// remark : "呵呵1"
// }
// }});
UserSchema.statics.addFriend = function(myEmail,otherEmail,callback){
var myId , otherId;
var self = this;
self.findOneByEmail(myEmail,function(err,doc){
myId = doc._id;
self.findOneByEmail(otherEmail,function(err,doc){
otherId = doc._id;
if(!otherId){callback("不存在的用户!");return;}
//添加好友都默认添加到 “我的好友” 列表
self.update({_id:myId},{"$push":{"user_friend_groups.0.list":{friend:otherId,remark:""}}},callback(err));
self.update({_id:otherId},{"$push":{"user_friend_groups.0.list":{friend:myId,remark:""}}},callback(err));
});
});
// // 介于js异步执行,这里将添加好友放至 取得myId 与 otherId 后的回调里嵌套执行。防止未取得Id值就执行添加好友到列表而错误
}
//删除好友 DONE, TOTEST //查询代码(以下几行注释为命令行下测试代码)mongo命令行下已测试(同addFriend代码一起测试)
// db.users.update({ user_email:"jaysir@163.com",
// "user_friend_groups.list.remark":"呵呵1"
// },
// {"$pull":{
// "user_friend_groups.$.list":{remark:"呵呵1"}
// }
// })
UserSchema.statics.delFriend = function(myEmail,otherEmail,callback){
var myId , otherId;
var myId , otherId;
var self = this;
self.findOneByEmail(myEmail,function(err,doc){
myId = doc._id;
self.findOneByEmail(otherEmail,function(err,doc){
otherId = doc._id;
if(!otherId){callback("不存在的用户!");return;}
self.update({_id:myId,"user_friend_groups.list.friend":otherId},{"$pull":{"user_friend_groups.$.list":{friend:otherId}}},callback(err));
self.update({_id:otherId,"user_friend_groups.list.friend":myId},{"$pull":{"user_friend_groups.$.list":{friend:myId}}},callback(err));
});
});
}
//用户登陆后 获取初始化的数据 DONE TOTEST
//此处获取用户好友列表并解引用可以直接 result.user_friend_groups[0].list[0].friend.user_email,访问用户好友的Email等信息
//用户信息安全考虑,屏蔽掉解引用后好友的部分信息(未屏蔽,实现方案待定 WAITING)
UserSchema.statics.getFriendList = function(email , callback){
var self = this;
self.findOne({user_email:email}).populate("user_friend_groups.list.friend").exec().then(function(result){
//对用户好友列表进行排序
result.user_friend_groups.sort(function(obj1,obj2){return obj1.g_sort-obj2.g_sort;});
callback(result);
});
}
//用户注册 初始化数据 DONE TOTEST UserSchema.statics.regInitData = function(options , callback){
var userInf = {
user_email : options.email ? options.email : options.user_email,
user_password : options.password ? options.password : options.user_password,
user_nickname : (options.nickname||options.user_nickname) ? (options.nickname||options.user_nickname) : "",
user_sex : (options.sex == "女")||(options.user_sex == "女") ? "女" : "男",
user_pic : "url",
"user_friend_groups.0" : {
g_name : "我的好友",
g_sort : 0,
list : []
},
user_reg_time : Date()
}
var newUser = new userModel(userInf);
newUser.save(callback());
} //更新用户信息
UserSchema.statics.updateInf = function(options,callback){
//TODO
} module.exports = mongoose.model('users', UserSchema);

原创,转载请著名

Mongoose 表实例的更多相关文章

  1. sharding-jdbc之——分库分表实例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79368021 一.概述 之前,我们介绍了利用Mycat进行分库分表操作,Mycat ...

  2. (原创)hibernate 一对多建表实例详解 附上各个注释的含义

    这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...

  3. Qt StyleSheet样式表实例(转)

    QT论坛看到的,收藏一下! 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表. 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计.自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑 ...

  4. Django开发密码管理表实例【附源码】

    文章及代码比较基础,适合初.中级人员,高手略过 阅读此篇文章你可以: 获取一个Django实现增删改查的案例源码 了解数据加密的使用场景和方法以及如何在Python3中使用 背景介绍 DBA需要维护一 ...

  5. JAVA 99乘法表实例

    实例: public class Test{ public static void main(String[] args){ for(int i=1;i<=9;i++){ for(int j=1 ...

  6. Oracle建表实例

    建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: CREATE TABLE banping  ...

  7. oracle数据库、客户端安装以及ps/sql连接和导入表实例

    从下面的网址下载http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098 ...

  8. 6.JAVA-链表实例

    1.实现链表的步骤 1).实现Node节点类(用来保存链表中每个节点的数据,以及下一个节点成员) 2).实现LinkList链表类(用来封装Node节点类,和用户实现交互) 3).在LinkList类 ...

  9. JDBC创建表实例

    在本教程将演示如何在JDBC应用程序中创建一个数据库表. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中创建数据库表. 要执行以下示例,需要用实际用户名和密码替 ...

随机推荐

  1. Docker容器学习--1

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  2. 第八篇:ORM框架SQLAlchemy 了解知识

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  3. ZendFramework-2.4 源代码 - 关于MVC - Model层类图

  4. DeepFaceLab报错,CUDA driver is insufficient 解决方法!

    DeepFaceLab出错,虽然错误提示很长很长,但是无非两种情况,一种是驱动没装好,一种是显存配置不够. CUDA driver version is insufficient for CUDA r ...

  5. thinkphp-PHP实现Excel导入 导出功能

    Excel导出 //功能:导出题库模板 public function get_contract_ex() { ob_get_clean(); header("Content-Typ:tex ...

  6. python各种操作列表的方法及案例

    一.循环的使用方法 names = ["张真","刘德华","哈林","谢霆锋","张柏芝"] fo ...

  7. Vue之简易的留言板功能

    今天我将带大家通过Vue的todolist案例来完成一个简易的网页留言板! LES'T GO! 首先我们需要在页面上搭建一个input文本输入框,并设置提交按钮,通过循环指令来完成输入框的信息提交! ...

  8. A1016 Phone Bills (25)(25 分)

    A1016 Phone Bills (25)(25 分) A long-distance telephone company charges its customers by the followin ...

  9. 扩展程序 - Google Chrome

    Adblock Plus 3.0.3 Adblock Plus 已被超过 1 亿台设备使用,是世界上最受欢迎的广告拦截软件. ID:cfhdojbkjhnklbpkdaibdccddilifddb 查 ...

  10. MySQL之索引(二)

    高性能的索引策略 正确地创建和使用索引是实现高性能查询的基础.在MySQL之索引(一)这一章中我们介绍了各种类型的索引及其对应的优缺点.现在我们一起来看看如何真正地发挥这些索引的优势. 独立的列 我们 ...