mongodb的使用

6 .创建日志文件

cd c:\data (进入data目录)

md log (创建目录log)

cd log (进入目录log)

type nul>mongodb.log (创建日志文件mongodb.log)

以上操作形成如下目录结构

data 数据库目录

-----db 数据库文件

-----etc 数据库配置文件

-----mongo.conf

-----log 数据库日志

-----mongodb.log

7 . 启动数据库服务器

C:\Program Files\MongoDB\Server\3.4\bin

(第二种方法)

mongod --config c:/data/etc/mongo.conf 启动后无任何反应

8 .以Windows服务器运行MongoDB

以管理员方式打开CMD窗口,运行如下命令安装MongoDB服务,

然后按下 window+R 键 在运行栏目输入:services.msc 找到名为“MongoDB”的服务右键启动

mongod --config “c:\data\etc\mongo.conf” --install

启动服务方式二

在CMD窗口中运行如下命令,也可以在可以在 “控制面板\所有控制面板项\管理工具\服务”

net start mongodb

net stop mongodb 关闭服务


mongodb 终端操作

===============================================================================

mongodb 增删改查

启动:mongod --config c:\data\etc\mongod.conf

连接:mongo

--------增---------------

use demo 创建demo数据库

show dbs 看不到

db.createCollection(‘user’) 创建user集合

show collections 查看集合 show tables 相同

db.user.insert({name:‘张三’,age:20}) 创建users 集合 并插入一条文档

db.user.insert([{name:‘张三’,age:20},{name:‘李四’,age:30}]) 插入多条文档

db.user.save({name:‘张三’,age:30}) 等同于 insert

虽然insert和save方法都可以插入数据,当“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息

------------删--------------------

db.dropDatabase() ;删除当前所在数据库

db.user.drop() 删除集合

db.user.remove({name:‘张三’});删除name为张三的文档 参数 {} 删除所有

--------------查-------------------

show dbs 查询数据库

show collections 查询当前数据库下的集合 也可 show tables

db.user.find(); 查询所有 想格式化 .pretty()

db.user.findOne();查询第一条

db.user.find().count(); 查询集合文档条数

db.user.find({“_id”: ObjectId(“584bc73ea635e489676cf5db”)}) 根据id查询数据

db.user.find({age:{$gt:20}});查询年龄大于20的 $lt $eq $lte $gte $ne 不等

db.user.find({‘age’:{ g t : 20 , gt:20, gt:20,lt:30}}) 大于20 并且小于30

db.user.find({‘name’:{$ne:‘lv’}}); $ne不等于

db.user.find({$or:[{‘name’:‘lv’},{‘name’:‘chen’}]}) $or选择器 只要满足一个条件

db.user.find({$and:[{‘name’:‘lv’},{price:5000}]}) $and 多添件同事满足

db.user.find({age:{$in:[20,21,22]}}) ; $in 包含

db.user.find({age:{$nin:[20,21,22]}}) ; $nin 不包含

db.user.find().sort({age:1}) 1:表示升序 -1:表示降序

db.user.find().limit(10)  限制数量:db.表名.find().limit(数量);

db.user.find().skip(5)   跳过指定数量:db.表名.find().skip(数量);

db.user.find({},{name:1,age:1,sex:0}) 指定字段返回 1:返回 0:不返回

-------改-------------------------------------------

db.user.update({name:“张三”},{$set:{age:25}}) 更新数据: (只改第一条) 与 save()方法相同,(save有则改,没有则添加)

db.user.update({name:“张三”},{$set:{age:25}},{multi: true}) 更新数据: (匹配到的所有)

db.user.update({name:“张三”},{$set:{‘class.age’:25}})


mongoose

mongoose是NodeJS操作MongoDB数据库的中间层(中间件)NodeJS驱动不能应用在其他后端语言中

首先,安装mongoose

cnpm install mongoose --save

连接数据库

var mongoose = require(‘mongoose’);

mongoose.connect(“mongodb://localhost:27017/test”, function(err) {

if(err){

console.log(‘连接失败’);

}else{

console.log(‘连接成功’);

}

});

Mongooose中,有三个比较重要的概念,分别是Schema、Model、Entity

Schema

Schema主要用于定义MongoDB中集合Collection里文档document的结构, 如下生创建schema:

var mongoose = require(‘mongoose’);

module.exports = new mongoose.Schema({

username: String,

txt: String

});

定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种

String 字符串

Number 数字

Date 日期

Buffer 二进制

Boolean 布尔值

Mixed 混合类型

ObjectId 对象ID

Array 数组

注意:创建Schema对象时,声明字段类型有两种方法,一种是首字母大写的字段类型,另一种是引号包含的小写字段类型

var mySchema = new Schema({title:String, author:String});

//或者

var mySchema = new Schema({title:‘string’, author:‘string’});

timestamps(时间戳)

在schema中设置timestamps为true,schema映射的文档document会自动添加createdAt和updatedAt这两个字段,代表创建时间和更新时间

var UserSchema = new Schema(

{…},

{ timestamps: true }

);

_id

每一个文档document都会被mongoose添加一个不重复的_id,_id的数据类型不是字符串,而是ObjectID类型。如果在查询语句中要使用_id,则需要使用findById语句,而不能使用find或findOne语句

Model (模型类)

模型Model是根据Schema编译出的构造器,或者称为类,通过Model可以实例化出文档对象document

文档document的创建和检索都需要通过模型Model来处理

下面我们创建一个model类:

var mongoose=require(‘mongoose’);

var myschema=require(‘…/schema/schema’);

var MyModel=mongoose.model(‘MyModel’,myschema);

module.exports=MyModel;

使用mongoose下的model()方法,将Schema编译为Model。model()方法的第一个参数是模型名称

注意:一定要将model()方法的第一个参数和其返回值设置为相同的值,否则会出现不可预知的结果

Mongoose会将集合名称设置为模型名称的小写版。如果名称的最后一个字符是字母,则会变成复数;如果名称的最后一个字符是数字,则不变;如果模型名称为"MyModel",则集合名称为"mymodels";如果模型名称为"Model1",则集合名称为"model1"

entity(实体)

通过对模型MyModel使用new方法,实例化出文档document对象

请看下例:

var MyModel=require(‘./models/model’);

var doc1 = new MyModel({username: ‘tom’ });

doc1.save(function (err,doc) {

// { __v: 0, username: ‘tom’,_id: 5970daba61162662b45a24a1 }

console.log(doc);

})

通过new Model1()创建的文档doc1,必须通过save()方法,才能将创建的文档保存到数据库的集合中

回调函数是可选项,第一个参数为err(错误对象),第二个参数为保存的文档对象

文档新增

三种方式:save()、create()、insertMany()

var MyModel=require(‘./models/model’)

//方法一

new MyModel({username:‘tom’,txt:‘hello world’}).save(function(err,doc){

//[ { _id: 59720bc0d2b1125cbcd60b3f, username: ‘tom’, txt: ‘hello world’, __v: 0 } ]

console.log(doc);

});

//方法二

MyModel.create({username:“xiaowang”},{username:“xiaoli”},function(err,doc1,doc2){

//{ __v: 0, username: ‘xiaowang’, _id: 59720d83ad8a953f5cd04664 }

console.log(doc1);

//{ __v: 0, username: ‘xiaoli’, _id: 59720d83ad8a953f5cd04665 }

console.log(doc2);

});

//方法三

temp.insertMany([{username:“a”},{username:“b”}],function(err,docs){

//[ { __v: 0, username: ‘a’, _id: 59720ea1bbf5792af824b30c },

//{ __v: 0, username: ‘b’, _id: 59720ea1bbf5792af824b30d } ]

console.log(docs); //数组

});

文档查询

三种方式:find()、findById()、findOne()

find() 四个参数都是可选的

第一个参数表示查询条件,第二个参数用于控制返回的字段,第三个参数用于配置查询参数,第四个参数是回调函数,回调函数的形式为function(err,docs){}

//查找 年龄大于18 、只返回age字段 、跳过前两条数据

temp.find({age:{$gte:18}},{age:1,name:0,_id:0},{skip:2},function(err,docs){

//find()查询 docs一定是数组

//[ { age: 27},

//{ age: 18 },

//{ age: 30}]

console.log(docs);

})

如果使用第三个参数,前两个参数如果没有值,需要设置为null

temp.find(null,null,{skip:2},function(err,docs){

//[ { _id: 5971f93be6f98ec60e3dc86e, name: ‘huo’, age: 30 },

//{ _id: 5971f93be6f98ec60e3dc86f, name: ‘li’, age: 12 } ]

console.log(docs);

})

findById()

temp.findById(“5c0881fca55c161d28da8376”,function(err,doc){

//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’, age: 27 }

console.log(doc);

})

//或者下面

temp.findById(“5c0881fca55c161d28da8376”).exec(function(err,doc){

//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’, age: 27 }

console.log(doc);

})

findOne()

例:

找出age>20的文档中的第一个文档,且输出包含name字段在内的最短字段 lean为true表示输出最少字段(只包含_id)

temp.findOne({age:{$gt : 20}},“name”,{lean:true},function(err,doc){

//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’ }

console.log(doc);

})

temp.findOne({age:{$gt : 20}},“name”).lean().exec(function(err,doc){

//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’ }

console.log(doc);

})

文档更新

update()

updateMany()

find() + save()

updateOne()

findOne() + save()

findByIdAndUpdate()

fingOneAndUpdate()

update()

第一个参数conditions为查询条件,第二个参数doc为需要修改的数据,第三个参数options为控制选项,第四个参数是回调函数

Model.update(conditions, doc, [options], [callback])

options

upsert (boolean): 默认为false。如果不存在则创建新记录。

multi (boolean): 默认为false。是否更新多个查询记录。

使用update()方法查询age大于20的数据,并将其年龄更改为40岁

//只改一条数据 如果查不到,则什么也不干

temp.update({age:{$gte:20}},{age:40},function(err,raw){

//{ n: 1, nModified: 1, ok: 1 }

console.log(raw);

})

// 所有大于20的数据 全改

temp.update({age:{$gte:20}},{age:40},{multi:true},function(err,raw){

//{ n: 1, nModified: 1, ok: 1 }

console.log(raw);

})

// 将年龄为100岁的那条信息 name改为 hundred upsert参数为true,若没有符合查询条件的文档,mongo将会综合第一第二个参数向集合插入一个新的文档

temp.update({age:100},{name: “hundred”},{upsert:true},function(err,raw){

//{ n: 1, nModified: 0,upserted: [ { index: 0, _id: 5972c202d46b621fca7fc8c7 } ], ok: 1 }

console.log(raw);

})

find() + save()

如果需要更新的操作比较复杂,可以使用find()+save()方法来处理,比如找到年龄小于30岁的数据,名字后面添加’30’字符

temp.find({age:{$lt:20}},function(err,docs){

//[ { _id: 5971f93be6f98ec60e3dc86d, name: ‘wang’, age: 10 },

//{ _id: 5971f93be6f98ec60e3dc86f, name: ‘li’, age: 12 }]

console.log(docs);

docs.forEach(function(item,index,arr){

item.name += ‘30’;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
,

//{ _id: 5971f93be6f98ec60e3dc86f, name: ‘li’, age: 12 }]

console.log(docs);

docs.forEach(function(item,index,arr){

item.name += ‘30’;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-FwN1zVMB-1715555891664)]

[外链图片转存中…(img-MTSldwdB-1715555891664)]

[外链图片转存中…(img-vZUKEtvR-1715555891665)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值