好像还没写过关于MongoDB的文章。有些命令没用久了还是要找文章查文档,所以还是记一下吧,先想到什么记什么。
安装就不说了。
命令行
插入
db.collection_name.insert({document})
同时插入多个文档可以传入数组。
例子:
db.user.insert({name: 'Sam', age: 18})
相当于SQL语句
insert into user(name, age) values("Sam", 18)
修改
db.collection_name.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query:update的查询条件,类似sql update查询内where后面的。
update:update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。
upsert:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi:可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern:可选,抛出异常的级别。
例子:
db.user.update({name: 'aaa'}, {$set: {name: 'bbb'}}, {multi: true})
该例意思为将user表中名字叫aaa的该为bbb,默认只会修改匹配的第一条,multi为true代表修改多条。相当于SQL语句
update user set name="aaa" where name="bbb"
删除
db.collection_name.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
query:(可选)删除的文档的条件。
justOne:(可选)默认为false,删除所有匹配的文档,如果设为 true 或 1,则只删除一个文档。
writeConcern:(可选)抛出异常的级别。
例子:
db.user.remove({name: 'aaa'})
相当于SQL语句
delete from user where name="aaa"
如果要删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
db.collection_name.remove({})
查询
db.collection.find(query, projection)
参数说明:
query:可选,使用查询操作符指定查询条件。
projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
例子:
db.user.find({age: {$gte: 18}})
意思为在user集合中找出年龄大于或等于18岁的,相当于SQL语句
select * from user where age>=18
查询之$and、$or、$in
三者配合使用,如下,$or和$in的区别在于a=1或者b=1和c=1或者2
db.collection.find({
$and: [
{ $or: [{a: 1}, {b: 1}] },
{ c: { $in: [1, 2]} }
]
})
mongoose
mongoose是实际开发中最常用的操作mongodb的第三方模块。
装包
npm install mongoose --save
创建db.js文件链接mongodb
const mongoose = require('mongoose');
const dbUrl = 'mongodb://用户名:密码@地址:端口(默认27017)/数据库名';
/**
* 连接
*/
mongoose.connect(dbUrl);
/**
* 连接成功
*/
mongoose.connection.on('connected', function () {
console.log('Mongoose connection open to ' + dbUrl);
});
/**
* 连接异常
*/
mongoose.connection.on('error',function (err) {
console.log('Mongoose connection error: ' + err);
});
/**
* 连接断开
*/
mongoose.connection.on('disconnected', function () {
console.log('Mongoose connection disconnected');
});
module.exports = mongoose;
Schema
mongoose中使用Schema来定义集合中文档的结构模型。例如,新建一个user集合,定义user集合中文档结构,如下
const mongoose = require('./db.js');
const Schema = mongoose.Schema;
//user集合数据实例结构
let userSchema = new Schema({
username: {type: String},
pwd: {type: String},
type: {type: String, default: 'ordinary'}
});
//暴露user集合(类)
module.exports = mongoose.model('User', userSchema);
插入
const User = require('./user');
// 插入数据
let user = new User({
username: 'Sam',
pwd: 'xxx'
})
user.save((err, result) => {
if(err) return console.log(err);
console.log(result);
})
查询
collection.find(query, fields, options, callback)
参数说明:
query:查询条件。
fields:可选,要找出哪些字段,比如{name: 1}为只找出name字段,{age: 0}为除了age字段其他字段都找出。
options:可选,比如sort和limit之类的其他选项。
例子:
假设有一个article集合
const Article = require('./article');
// 基础查询所有
Article.find({}, (err, result) => {})
// 查找一条
Article.findOne({auth: 'Sam'}, (err, result) => {})
// 多条件模糊查询
let keyword = 'Sam';
let reg = new RegExp(keyword, 'i');
Article.find(
{$or: [
{auth: keyword}, //查找auth等于"sam"
{title: {$regex: reg}} //或者title中含有"sa"'
]},
null, //查找所有字段
{
sort: {_id: -1}, // 按照 _id倒序排列
limit: 10 // 查询10条
},
(err, result) => {}
)
// 链式写法及分页
let pageNum = 1, pageSize = 10;
Article.find(
{$or: [
{auth: keyword}, //查找auth等于"sam"
{title: {$regex: reg}} //或者title中含有"sa"'
]}
).sort({_id: -1}).skip((pageNum-1) * pageSize).limit(pageSize).exec((err, result) => {})
修改
collection.update(query, update, options, callback)
例子:
const Article = require('./article');
//默认只更新第一个数据,如果把multi设置为true,则更新所有找到的数据。
Article.update({auth: 'aaa'}, {$set: {name: 'bbb'}}, {multi: true}, (err, result) => {})
// 数组字段中删除一条
Article.update(
{_id : "xxx"}, //哪篇文章
{'$pull':{ reply : { reply_id : 123 }}}, //文章评论
(err, result) => {}
);
// 数组字段中添加一条
Article.update(
{_id : "xxx"},
{'$push':{ reply : {content: '大家好'}}},
(err, result) => {}
);
这里说明一下,update()返回数据处理条数,还有一个常用的方法findOneAndUpdate()返回处理后的那条文档。
// 找到_id为xxx的文章,浏览数加1,默认返回修改前的文档,设置{new: true}则返回修改后的文档
Article.findOneAndUpdate({_id: xxx}, {$inc: {views: 1}}, {new: true}, (err, doc) => {})
删除
collection.remove(query, callback)
数据迁移
数据嵌套操作
对象里嵌套数组
添加
比如数据文档是这样的
{
"_id" : ObjectId("5a3672b2c0e07c5f2ab47f06"),
"tags": {
"vue": []
}
}
你想往tags里的vue添加"haha",你可以
db.collection.update({_id:'5a3672b2c0e07c5f2ab47f06'},{$push:{'tags.vue':'haha'}})
使用上面命令,将vue换成react,如果文档中不存在react属性则自动创建。最后数据会变成
{
"_id" : ObjectId("5a3672b2c0e07c5f2ab47f06"),
"tags" : {
"vue" : [
"haha"
],
"react" : [
"haha"
]
}
}
上述代码中,如果'tags.vue'中的'vue'是不确定的,是个变量,则可以 let x = 'vue'; {$push: {[`tags.${x}`]: 'haha'}}
删除
删除也跟上面差不多。假设原来数据是这样
{
"_id" : ObjectId("5a3672b2c0e07c5f2ab47f06"),
"tags" : {
"vue" : [
"haha"
],
"react" : [
"321",
"haha"
]
}
}
执行命令
db.collection.update({_id:'5a3672b2c0e07c5f2ab47f06'},{$pull:{'tags.react':'haha'}})
最后数据变成
{
"_id" : ObjectId("5a3672b2c0e07c5f2ab47f06"),
"tags" : {
"vue" : [
"haha"
],
"react" : [
"321"
]
}
}
删除字段
删除tags里的vue字段
db.collection.update({_id:'xxx'},{$unset:{'tags.vue':''}})
数组里套对象
比如原数据是
{
"_id" : ObjectId("5a3672b2c0e07c5f2ab47f06"),
"type" : [
{
"name" : "JavaScript",
"number" : 2
},
{
"name" : "node.js",
"number" : 1
}
]
}
这时你想将type数组中name属性值为"JavaScript"的对象的number属性值加1
db.collection.update({"type.name":"JavaScript"},{$inc:{"type.$.number":1}})
{"type.name":"JavaScript"} 表示在type中找到name为JavaScript的对象。
"type.$.number" 中 "$" 操作符将查询结果中的数组的内容限制为只包含与查询文档相匹配的第一个元素。