nodejs(三)下之mangoDB
- mongoDB
- 简介
- 一、什么是MongoDB ?
- 1、MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
- 2、MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- 3、MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
- 二、历史
- 1、2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。
- 2、2012年05月23日,MongoDB2.1 开发分支发布了! 该版本采用全新架构,包含诸多增强。
- 3、2012年06月06日,MongoDB 2.0.6 发布,分布式文档数据库。
- 4、2013年04月23日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及bug修复。
- 5、2013年08月20日,MongoDB 2.4.6 发布,是目前最新的稳定版。
- 三、主要特点
- 1、MongoDB的提供了一个面向文档存储,基本的思路就是将原来“行”的概念换成更加灵活的“文档”模型。一条记录可以表示非常复杂的层次关系。
- 2、Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- 3、非常容易扩展。面对数据量的不断上涨,通常有两种方案,一种是购买更好的硬件,别一种是分散数据,进行分布式的扩展,前者有着非常大的缺点,因 为硬件通常是有物理极限的,当达到极限以后,处理能力就不可能再进行扩展了。所以建议的方式是使用集群进行扩展。MongoDB所采用的面向文档的数据模 型使其可以自动在多台服务器之间分割数据。它还可以平衡集群的数据和负载,自动重排文档。
- 4、MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- 5、丰富的功能。包括索引、存储JavaScript、聚合、固定集合、文件存储等。
- 6、方便的管理,除了启动数据库服务器之外,几乎没有什么必要的管理操作。管理集群只需要知道有新增加的节点,就会自动集成和配置新节点。
- 安装
- brew install mongodb
- http://blog.sina.com.cn/s/blog_7c8dc2d50101lwka.html
- 概念
- 一、数据库
- 1、一个mongodb中可以建立多个数据库。
- 2、MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
- 3、数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
- 1.不能是空字符串(””)。
- 2.不得含有’ ‘(空格)、.、$、/、\和\0 (空宇符)。
- 3.应全部小写。
- 4.最多64字节。
- 4、有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- 1.admin: 从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- 2.local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- 3.config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
- 二、文档
- 文档是mongodb中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一行数据。
- 多个键及其关联的值有序的放置在一起就是文档。MongoDB使用了BSON这种结构来存储数据和网络数据交换。
- BSON数据可以理解为在JSON的基础上添加了一些json中没有的数据类型。
- 如果我们会JSON,那么BSON我们就已经掌握了一半了,至于新添加的数据类型后面我会介绍。
- 文档例子如下:
- {name:”张三”,age:20,hobby:[“看书”,”旅游”,”唱歌”]}
- 需要注意的是:
- 1. 文档中的键/值对是有序的。
- 2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌人的文档)。
- 3. MongoDB区分类型和大小写。
- 4. MongoDB的文档不能有重复的键。
- 5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
- 文档键命名规范:
- 1 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- 2 .和$有特别的意义,只有在特定环境下才能使用。
- 3 以下划线”_”开头的键是保留的(不是严格要求的)。
- 三、集合
- 集合就是一组文档的组合。如果将文档类比成数据库中的行,那么集合就可以类比成数据库的表。
- 在mongodb中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的,比如下面的两个文档可以同时存入到一个集合中:
- {“name”:”tangcaiye”}
- {“Name”:”tangcaiye”,”sex”:”nan”}
- 注:当第一个文档插入时,集合就会被创建。
- 合法的集合名
- 1. 集合名不能是空字符串””。
- 2. 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 3. 集合名不能以”system.”开头,这是为系统集合保留的前缀。
- 4. 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
- 四、 MongoDB 数据类型
- 下表为MongoDB中常用的几种数据类型。
- 终端中启动
- 首先需要指定数据库的地址:
- mongod —dbpath=数据库地址
- 再在终端中键入mongo
- 在启动之后可以通过可视化数据库管理工具操作
- 操作mongodb基础
- 1.创建数据库
- use database_name database_name代表数据库的名字
- 注:如果数据库不存在,则创建数据库,否则切换到指定数据库
- 2.查看所有数据库
- show dbs
- 注:我们刚创建的数据库 person 如果不在列表内, 要显示它,我们需要向 person 数据库插入一些数据 db.person.insert({name:”zhangSan”,age:30})
- 3.查看当前使用的数据库
- db 或 db.getName()
- 注:db代表的是当前数据库 也就是person这个数据库
- 4.删除数据库
- db.dropDatabase()
- 5.断开连接
- exit
- 6.查看命令api
- help
- 操作集合
- 操作集合方法
- 查看帮助api
- 语法
- db.worker.help()
- 查看当前数据库下有哪集合(collection)
- 语法
- show collections
- 创建集合(collection)
- 1. 使用 db.createCollection(collection_Name)方法
- 语法
- db.createCollection(“collection_Name”) collection_Name集合的名称
- 2. 使用 db.collection_Name.insert(document)方法
- 语法
- db.collection_Name.insert(document) collection_Name集合的名称 document要插入的文档
- 注:两者的区别在于前者创建了一个空的worker集合 后者创建了一个空的worker集合并添加了一个Document数据
- 删除当前数据库中的集合(collection)
- 语法
- db.collection_Name.drop() collection_Name 集合的名称
- 文档操作
- 插入文档
- 1、 使用insert()方法插入文档
- 语法
- db.collection_name.insert(document) collection_name集合的名字 document插入的文档
- 实例
- db.worker.insert({name:’zpx’,age:6}) 向worker集合添加一个{name:’zpx’,age:6}的Document
- db.worker.insert([{name:’wangWu’,age:50},{name:’xiaoMing’,age:60}]) 向worker集合添加多个[{name:’wangWu’,age:50},{name:’xiaoMing’,age:60}] 的Document
- 2、 使用save()方法插入文档
- 语法
- db.collection_name.save(document) collection_name集合的名字 document插入的文档
- 注:如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
- 实例
- db.person.save({name:”xiaoHong”,age:50})
- db.person.save({_id:ObjectId(“562c9caf671c978b6596e825”),name:”xiaoHong”,age:10})
- 文档更新
- MongoDB 更新文档
- 1.update()方法用于更新已存在的文档
- 语法
- db.collection.update(
- <query>,
- <update>,
- {
- upset: <boolean>,
- multi: <boolean>,
- writeConcern: <document>
- }
- )
- 参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$set,$inc...)等 $inc在原基础上累加后更新 $set直接更新
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
- 实例
- db.worker.update({name:’liSi’},{$set:{name:’liSi_update’}}) 将document数据中name是liSi 的数据的name修改为liSi_update
- 注:如果有多条name是liSi的数据只更新一条
- db.worker.update({name:’liSi_update’}, {$set: {age:40}},{multi:true}) 将document数据中name是liSi_update 的数据的age修改为 40
- 注:如果有多条name是liSi的数据这些数据全部更新
- db.worker.update({name:’liSi_update’},{$inc:{age:1}}) 将document数据中name是lliSi_update 的数据的age在原来的基础上加1
- 2.save()方法通过传入的文档来替换已有文档
- 语法
- db.collection.save(
- <document>,
- {
- writeConcern: <document>
- }
- 参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
- 实例
- db.person.save({_id:ObjectId(“562c9caf671c978b6596e825”),name:”xiaoHong”,age:10})
- 文档删除
- MongoDB 删除文档
- remove()方法是用来移除集合中的数据。
- 注:在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
- 语法
- db.collection.remove(
- <query>,
- <justOne>
- )
- 如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
- db.collection.remove(
- <query>,
- {
- justOne: <boolean>,
- writeConcern: <document>
- }
- )
- 参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
- 实例
- db.worker.remove({name:’fJianZhou’}) 删除worker集合里name是fJianZhou的所有Document数据
- db.person.remove({name:”xiaoHong”},1) 删除person集合里name是xiaoHong的第一条数据
- 查询文档
- MongoDB 查询文档
- 1.find()方法
- 语法
- db.collection_name.find() collection_name 集合的名字
- 实例
- db.worker.find() 查询worker下所有的document数据
- 2.find()方法 查询指定列
- 语法
- db.collection_name.find({queryWhere},{key:1,key:1}) collection_name 集合的名字 key要显示字段 1表示显示 queryWhere参阅查询条件操作符
- 实例
- db.worker.find({},{age:1}) 查询指定列
- 3.pretty()方法以格式化的方式来显示所有文档。
- 语法
- db.collection_name.find().pretty() collection_name 集合的名字
- 实例
- db.worker.find().pretty()
- 4.findOne()方法查询匹配结果的第一条数据
- 语法
- db.collection_name.findOne() collection_name 集合的名字
- 实例
- 查询条件操作符
- 查询条件操作符
- 描述:条件操作符用于比较两个表达式并从mongoDB集合中获取数据。
- 1.MongoDB (>) 大于操作符 - $gt
- 语法
- db.collectionName.find({<key>:{$gt:<value>}}) collectionName集合名词 key字段 value值
- 实例
- db.worker.find({age:{$gt:30}}) 查询age 大于 30的数据
- 2.MongoDB(>=)大于等于操作符 - $gte
- 语法
- db.collectionName.find({<key>:{$gte:<value>}}) collectionName集合名词 key字段 value值
- 实例
- db.worker.find({age: {$gte: 30}}) 查询age 3大于等于30 的数据
- 3.MongoDB (<) 小于操作符 - $lt
- 语法
- db.collectionName.find( {<key>:{$lt:<value>}}) collectionName集合名词 key字段 value值
- 实例
- db.worker.find({age: {$lt: 30}}) 查询age 小于30的数据
- 4.MongoDB (<=) 小于等于操作符 - $lte
- 语法
- db.collectionName.find({<key>:{$lte:<value>}}) collectionName集合名词 key字段 value值
- 实例
- db.worker.find({age: {$lte: 30}}) 查询age 小于等于30的数据
- 5.MongoDB 使用 (>=) 和 (<=) 查询 - $gte 和 $lte
- 语法
- db.collectionName.find({<key>:{$gte:<value>},<key>:{$lte:<value>}}) collectionName集合名词 key字段 value值
- 实例
- db.worker.find({age: {$gte: 30, $lte: 50}}) 查询age 大于等于 30 并且 age 小于等于 50 的数据
- 6.MongoDB 等于(==)
- 语法
- db.collectionName.find({<key>:<value>,<key>:<value>}) collectionName集合名词 key字段 value值
- 实例
- db.worker.find({"age": 30})`查询age = 30的数据
- 7.MongoDB 使用 _id进行查询
- 语法
- db.collectionName.find({"_id" : ObjectId("value")}) value _id的值
- 实例
- db.worker.find({"_id" : ObjectId("562af23062d5a57609133974")}) 查询_id是 562af23062d5a57609133974 数据
- 8.MongoDB 查询某个结果集的数据的条数
- 语法
- db.collectionName.find().count() collectionName集合名称
- 实例
- db.worker.find().count()
- 9.MongoDB 查询某个字段的值当中是否包含另一个值
- 语法
- db.collection.find({key:/value/}) collectionName集合名称 key 字段 value值
- 实例
- db.worker.find({name:/value/}) 查询name里包含zhang的数据
- 10.MongoDB 查询某个字段的值当中是否以另一个值开头
- 语法
- db.collection.find({key:/^value/}) collectionName集合名称 key 字段 value值
- 实例
- db.worker.find({name:/^zhang/})
- 查询条件and和or
- 查询条件and和or
- 1.MongoDB AND 条件
- MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开
- 语法
- db.col.find({key1:value1, key2:value2}).pretty()
- 实例
- db.worker.find({name:’tangcaiye’,age:30}) 查询name是tangcaiye并且age是30的数据
- 2.MongoDB OR 条件
- MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
- 语法
- db.col.find(
- {
- $or: [
- {key1: value1}, {key2:value2}
- ]
- }
- )
- 实例
- db.worker.find({$or:[{age = 30},{age = 50}]}) 查询age = 30 或者 age = 50 的数据
- 3.AND 和 OR 联合使用
- 语法
- db.col.find(
- {
- key1:value1,
- key2:value2,
- $or: [
- {key1: value1},
- {key2:value2}
- ]
- }
- )
- 实例
- 查询 name是tangcaiye 并且 age是30 或者 age是 50 的数据
- db.worker.find({name:’tangcaiye’,$or:[{age:30},{age:50}]})
- limit和skip方法
- MongoDB Limit与Skip方法
- 1.MongoDB Limit() 方法 读取指定数量的数据记录
- 语法
- db.collectionName.find().limit(number) collectionName集合 number读取的条数
- 实例
- db.worker.find().limit(3) 查询前3条数据
- 2.MongoDB Skip() 方法 跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
- 语法
- db.collectionName.find().skip(number) collectionName集合 number跳过的条数
- 实例
- db.worker.find().skip(3) 查询3条以后的数据
- 3.MongoDB Skip()方法和Limit()方法混合使用
- 注: 通常用这种方式来实现分页功能
- 语法
- db.collectionName.find().limit(number).skip(number)
- 实例
- db.worker.find().sort({age:-1}) 查询在4-6之间的数据
- 排序
- 排序
- MongoDB sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
- 语法
- db.collectionName.find().sort({KEY:1}) 或者 db.collectionName.find().sort({KEY:-1}) collectionName集合 key表示字段
- 实例
- db.worker.find().sort({age:1}) 查询出并升序排序 {age:1} age表示按那个字段排序 1表示升序
- db.worker.find().sort({age:-1}) 查询出并降序排序 {age:-1} age表示按那个字段排序 -1表示降序
- mongoose
- 简介
- Mongoose是MongoDB的一个对象模型工具,是基于node-mongoldb-native开发的MongoDB nodes驱动,可以在异步的
- 环境下执行。同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让Node
- JS操作Mongodb数据库变得更加灵活简单。
- 2.Mongoose能做什么?
- Mongoose,因为封装了对MongoDB对文档操作的常用处理方法,让NodeJS操作Mongodb数据库变得更加容易。
- 安装
- 安装使用mongoose:
- 安装mongoose:
nam install mongoose - 引用mongoose:
var mongoose = require(“mongoose”); - 使用”mongoose”连接数据库:
var db = mongoose.connect(“mongodb://user:pass@localhost:port/database”); - 执行下面代码检查默认数据库test,是否可以正常连接成功?
var mongoose = require(“mongoose”); - var db = mongoose.connect(“mongodb://127.0.0.1:27017”);
- db.connection.on(“error”, function (error) {
- console.log(“数据库连接失败:” + error);
- });
- db.connection.on(“open”, function () {
- console.log(“数据库连接成功”);
- });
- 集合
- MongoDB —— 是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以Document(以下简称文档)的形式存储(Document,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。),后面我们会学习如何创建文档并插入内容。
- 在MongoDB中,多个Document可以组成Collection(以下简称集合),多个集合又可以组成数据库。
- 我们想要操作MongoDB数据,那就得先要具备上面所说的包含数据的“文档”,文档又是什么意思呢,请看如下介绍。
- 文档 —— 是MongoDB的核心概念,是键值对的一个有序集,在JavaScript里文档被表示成对象。同时它也是MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行,但更具表现力。
- 集合 —— 由一组文档组成,如果将MongoDB中的一个文档比喻成关系型数据库中的一行,那么一个集合就相当于一张表。
- 如果我们要通过Mongoose去创建一个“集合”并对其进行增删改查,该怎么实现呢,到这里我们就要先了解Schema(数据属性模型)、Model、Entity了。
- Schema
- Schema —— 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统意义的表结构),又或着是“集合”的模型骨架。
- //集合的数据模型定义,定义了字段名和字段的类型, 默认值
var PersonSchema = new mongoose.Schema({
name : { type:String },
age : { type:Number, default:0 },
time : { type:Date, default:Date.now },
email: { type:String,default:’’}
},{
collection:’jihe’
}); - 基本属性类型有:字符串、日期型、数值型、布尔型(Boolean)、null、数组、内嵌文档等。
- model
- 介绍
- Model —— 由Schema构造生成的模型,除了Schema定义的数据库骨架以外,还具有数据库操作的行为,类似于管理数据库属性、行为的类
- 代码
- //创建model model(集合名称,集合的数据模型)
var Model = db.model(“jihe”,PersonSchema); - Entity
- 介绍
- Entity —— 由Model创建的实体,使用save方法保存数据,Model和Entity都有能影响数据库的操作,但Model比Entity更具操作性。
- 代码
- //创建model model(集合名称,集合的数据模型)
var Model = db.model(“jihe”,PersonSchema);//创建一个文档
var jiheEntity = new Model({
name:”tangcaiye”,
age:8,
email:”1114602426@qq.com”
});
console.log(jiheEntity.name);
console.log(jiheEntity.time);jiheEntity.save(function (error,doc) {
if (error){
console.log(error);
}else{
console.log(doc);
}
}); - 保存
- Model.create({name:”zhangsan”,age:”15”}, function (err,doc) {
if (err){
console.log(err);
}else{
console.log(doc);
}
}); - 更改
- var query = {name:”zhangsan”};
var update = {$set:{age:100}};
Model.find(query, function (err,doc) {
console.log(doc);
});
Model.update(query,update, function (error) {
if (error){
console.log(error);
}else {
console.log(“更新成功”);
}
}) - 请注意如果匹配到多条记录,默认只更新一条,如果要更新匹配到的所有记录的话需要加一个参数 {multi:true}
- PersonModel.update(conditions, update,{multi:true},function(error){
- if(error) {
- console.log(error);
- } else {
- console.log(‘Update success!’);
- }
- });
- 删除数据
- var query = {name:”zhangsan”};
Model.remove(query, function (err) {
if (err){
console.log(err);
}else {
console.log(“删除成功”);
}
}) - 简单查询
- 属性过滤 find(Conditions,field,callback);
- field省略或为Null,则返回所有属性。
- //返回只包含name、age两个键的所有记录
- Model.find({},{name:1, age:1, _id:0},function(err,docs){
- //docs 查询结果集
- })
- 说明:我们只需要把显示的属性设置为大于零的数就可以,当然1是最好理解的,_id是默认返回,如果不要显示加上(“_id”:0),但是,对其他不需要显示的属性且不是_id,
如果设置为0的话将会抛异常或查询无果。 - findOne(查询单条)
- 与find相同,但只返回单个文档,也就说当查询到即一个符合条件的数据时,将停止继续查询,并返回查询结果。
- 1.单条数据 findOne(Conditions,callback);
- TestModel.findOne({ age: 6}, function (err, doc){
- // 查询符合age等于6的第一条数据
- // doc是查询结果
- });
- findOne方法,只返回第一个符合条件的文档数据。
- findById(按ID单条数据)
- 与findOne相同,但它只接收文档的_id作为参数,返回单个文档。
- 1.按ID单条数据 findById(_id, callback);
- PersonModel.findById(person._id, function (err, doc){
- //doc 查询结果文档
- });
- 高级查询
- //大于
Model.find({“age”:{“$gt”:6}}, function (err,doc) {
console.log(doc);
});
//小于
Model.find({“age”:{“$lt”:9}}, function (err,doc) {
console.log(doc);
});
//不等于
Model.find({“age”:{“$ne”:8}}, function (err,doc) {
console.log(doc);
}) - $or(或者)
- $or操作符,可以查询多个键值的任意给定值,只要满足其中一个就可返回,用于存在多个条件判定的情况下使用,如下示例:
- Model.find({“$or”:[{“name”:”tangcaiye”},{“age”:6}]},function(error,docs){
- //查询name为tangcaiye或age为6的全部文档
- });
- $exists(是否存在)
- $exists操作符,可用于判断某些关键字段是否存在来进行条件查询。如下示例:
- Model.find({name: {$exists: true}},function(error,docs){
- //查询所有存在name属性的文档
- });
- Model.find({email: {$exists: false}},function(error,docs){
- //查询所有不存在email属性的文档
- });
- 游标操作
- 简介
- 数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效的控制。可以限制结果的数量,略过部分结果,根据任意键按任意顺序的组合对结果进行各种排序,或者是执行其他操作。
- 最常用的查询选项就是限制返回结果的数量(limit函数)、忽略一点数量的结果(skip函数)以及排序(sort函数)。所有这些选项一点要在查询被发送到服务器之前指定。
- limit函数的基本用法
- 在查询操作中,有时数据量会很大,这时我们就需要对返回结果的数量进行限制,那么我们就可以使用limit函数,通过它来限制结果数量。
- 1.限制数量:find(Conditions,fields,options,callback);
- Model.find({},null,{limit:20},function(err,docs){
- console.log(docs);
- });
- 如果匹配的结果不到20个,则返回匹配数量的结果,也就是说limit函数指定的是上限而非下限。
- skip函数的基本用法
- skip函数和limit类似,都是对返回结果数量进行操作,不同的是skip函数的功能是略过指定数量的匹配结果,返回余下的查询结果。如下示例:
- 1.跳过数量:find(Conditions,fields,options,callback);
- Model.find({},null,{skip:4},function(err,docs){
- console.log(docs);
- });
- 如果查询结果数量中少于4个的话,则不会返回任何结果。
- sort函数的基本用法
- sort函数可以将查询结果数据进行排序操作,该函数的参数是一个或多个键/值对,键代表要排序的键名,值代表排序的方向,1是升序,-1是降序。
- 1.结果排序:find(Conditions,fields,options,callback);
- Model.find({},null,{sort:{age:-1}},function(err,docs){
- //查询所有数据,并按照age降序顺序返回数据docs
- });
- sort函数可根据用户自定义条件有选择性的来进行排序显示数据结果
nodejs(三)下之mangoDB的更多相关文章
- NodeJS平台下的前后端文件共享
一.前后端文件共享的需要背景——为什么需要共享? 项目基本JS/NodeJS全端开发,有部分代码前后端都需要用得到 有一些配置是在前后端都需要用得到的 区别其他开发平台,NodeJS平台下的前后端文件 ...
- html年月日下拉联动菜单 年月日三下拉框联动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 解析浏览器和nodejs环境下console.log()的区别
写在前面的 在开发调试过程中,我们经常需要调用console.log 方法来打印出当前变量的值,然而,console.log在浏览器环境下 有时会出现一些异常的现象 开撸代码 在浏览器和nodejs环 ...
- nodejs环境下的socket通信
结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...
- nodejs环境下配置运行mysql
首先需要在本地运行node环境 必须在本地安装mysql(可以用xampp里面的) 在node环境下引入mysql模块 命令: npm install node-mysql 运用例子(前提条件 ...
- nodejs windows下安装运行
node 官网下载地址http://nodejs.org/ 下载自己对应的版本 ,我下的是windows版本 node-v4.1.1-x64.msi 然后 下一步 下一步 就完成安装了,非常简单, ...
- nodejs (下)(设置响应参数)
响应: 可以自定义设置状态码(状态码范围内的):res.statusCode = 404; 修改响应头信息: res.setHeader('content-type','text/html ...
- 使用xshell linux安装nodejs,CentOS下安装并配置nodejs环境教程
1. 下载node最新版本 : 连接 https://nodejs.org/zh-cn/(查看node最新版本) 在跟目录root下,命令行输入: wget https://nodejs.org/ ...
- springboot+bootstrap实现图书商城管理(大三下学期课程设计)
在csdn上记一次自己的课程设计过程(已经实习两个月了.感觉这个很容易做.支付可能需要多花点时间.): 在此框架基础之上权限认证管理设置成功:https://blog.csdn.net/weixin_ ...
随机推荐
- shell脚本之函数的使用
把代码封装成函数,相当于造了一个“轮子”,之后就直接重复使用即可. 函数的创建 shell中函数的创建有2种方式 1.使用function关键字 语法 function test { ... } 2. ...
- vuex中store分文件时候index.js进行文件整合
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); import getters from './getters.js' impo ...
- 利用GitHub Pages和Hexo搭建个人博客
本文首发地址: 非生异也 本项目源码托管在GitHub上 Why 阮一峰曾经说过:喜欢写Blog的人,会经历3个阶段. 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现 ...
- 记一次有趣的 Netty 源码问题
背景 起因是一个朋友问我的一个关于 ServerBootstrap 启动的问题. 相关 issue 他的问题我复述一下: ServerBootstrap 的绑定流程如下: ServerBootstra ...
- CentOS下安装网卡驱动
前言最近,一台机器从FreeBSD换为CentOS,一路安装顺利.完事之后发现,网卡没有启用,dmesg | grep eth 命令确定网卡没有驱动导致的.于是开始了一路艰辛的安装过程. 安装过程1. ...
- Codeforces 482C Game with Strings(dp+概率)
题目链接:Codeforces 482C Game with Strings 题目大意:给定N个字符串,如今从中选定一个字符串为答案串,你不知道答案串是哪个.可是能够通过询问来确定, 每次询问一个位置 ...
- openvpn 移植之buildroot添加相关选项
openvpn 移植第一步,在buildroot 内添加 openssl ,openvpn , 另外还有一个 RSA 的支持,我不确定这个需要程度如何,但是也添加进去了. buildroot 添加相关 ...
- web.xml文件中<mime-mapping>
http://blog.csdn.net/sccemstanford/article/details/9064155 ————————————————————————————————————————— ...
- 以下( )可用于检索session属性userid的值。
A.session. getAttribute (“userid”); B.session. setAttribute (“userid”); C.request. getParameter (“us ...
- 【BZOJ】1025: [SCOI2009]游戏(置换群+dp+特殊的技巧+lcm)
http://www.lydsy.com/JudgeOnline/problem.php?id=1025 首先根据置换群可得 $$排数=lcm\{A_i, A_i表示循环节长度\}, \sum_{i= ...