Mongoose 表实例
/********** 用户表 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 表实例的更多相关文章
- sharding-jdbc之——分库分表实例
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79368021 一.概述 之前,我们介绍了利用Mycat进行分库分表操作,Mycat ...
- (原创)hibernate 一对多建表实例详解 附上各个注释的含义
这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...
- Qt StyleSheet样式表实例(转)
QT论坛看到的,收藏一下! 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表. 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计.自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑 ...
- Django开发密码管理表实例【附源码】
文章及代码比较基础,适合初.中级人员,高手略过 阅读此篇文章你可以: 获取一个Django实现增删改查的案例源码 了解数据加密的使用场景和方法以及如何在Python3中使用 背景介绍 DBA需要维护一 ...
- JAVA 99乘法表实例
实例: public class Test{ public static void main(String[] args){ for(int i=1;i<=9;i++){ for(int j=1 ...
- Oracle建表实例
建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: CREATE TABLE banping ...
- oracle数据库、客户端安装以及ps/sql连接和导入表实例
从下面的网址下载http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098 ...
- 6.JAVA-链表实例
1.实现链表的步骤 1).实现Node节点类(用来保存链表中每个节点的数据,以及下一个节点成员) 2).实现LinkList链表类(用来封装Node节点类,和用户实现交互) 3).在LinkList类 ...
- JDBC创建表实例
在本教程将演示如何在JDBC应用程序中创建一个数据库表. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中创建数据库表. 要执行以下示例,需要用实际用户名和密码替 ...
随机推荐
- G++ 编译多个源文件
g++ -c *.cpp g++ graph.o maxflow.o test.o -o test // 链接顺序必须写对
- SpringVC 拦截器+自定义注解 实现权限拦截
1.springmvc配置文件中配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...
- python 实现简单语音聊天机器人
'''思路:使用百度的文本转音频API,将结果保存成mp3格式,并用mp3play库播放该文件.''' 1 # -*- coding:utf-8 -*- import sys import reque ...
- 嵌入式开发 centos7 交叉编译环境准备
1. 安装centos7,启动图像化界面. 参考:https://blog.csdn.net/qq_23014435/article/details/74347925 # systemctl get- ...
- PHP添加扩展模块的方法
进入源码包对应扩展模块目录下 ##extname 代表扩展模块名 cd /usr/local/src/php-5.5.36/ext/extname 然后执行phpize##phpize是一个shell ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- [BZOJ2947]促销(Splay)
Description Great Bytelandish的超级市场网络请你编写一个程序模拟促销商品的成本费用(simulating costs of the promotionbeing prepa ...
- redis 之相关命令
为什么缓存数据库更要首选redis?如何使用redis? 一.使用缓存数据库为什么首选用redis? 我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memca ...
- oracle 基本函数
1)字符串函数---length()函数 用于返回字符串长度 select t.name,length(t.name) from tb_person t 2)向左补全字符串---LPAD()函数 L ...
- Java中Scanner中nextLine()方法和next()方法的区别
https://blog.csdn.net/hello_word2/article/details/54895106