MongoDB常用操作

好像还没写过关于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=1c=1或者2

db.collection.find({
    $and: [
        { $or: [{a: 1}, {b: 1}] },
        { c: { $in: [1, 2]} }
    ]
})

$and、$or、$in参考文章

菜鸟教程MongoDB

 

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集合中文档结构,如下

Schema中Date类型问题

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" 中 "$" 操作符将查询结果中的数组的内容限制为只包含与查询文档相匹配的第一个元素。

此处参考文章

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL。在使用MongoDB做产品原型的过程中,我们总结了MonogDB的一些亮点:使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。Schema-less,支持嵌入子文档:MongoDB是一个Schema-free的文档数据库。一个数据库可以有多个Collection,每个Collection是Documents的集合。Collection和Document和传统数据库的Table和Row并不对等。无需事先定义Collection,随时可以创建。Collection中可以包含具有不同schema的文档记录。 这意味着,你上一条记录中的文档有3个属性,而下一条记录的文档可以有10个属性,属性的类型既可以是基本的数据类型(如数字、字符串、日期等),也可以是数组或者散列,甚至还可以是一个子文档(embed document)。这样,可以实现逆规范化(denormalizing)的数据模型,提高查询的速度。图1 MongoDB是一个Schema-free的文档数据库图2是一个例子,作品和评论可以设计为一个collection,评论作为子文档内嵌在art的comments属性中,评论的回复则作为comment子文档的子文档内嵌于replies属性。按照这种设计模式,只需要按照作品id检索一次,即可获得所有相关的信息了。在MongoDB中,不强调一定对数据进行Normalize ,很多场合都建议De-normalize,开发人员可以扔掉传统关系数据库各种范式的限制,不需要把所有的实体都映射为一个Collection,只需定义最顶级的class。MongoDB的文档模型可以让我们很轻松就能将自己的Object映射到collection中实现存储。图2 MongoDB支持嵌入子文档简单易用的查询方式:MongoDB中的查询让人很舒适,没有SQL难记的语法,直接使用JSON,相当的直观。对不同的开发语言,你可以使用它最基本的数组或散列格式进行查询。配合附加的operator,MongoDB支持范围查询,正则表达式查询,对子文档内属性的查询,可以取代原来大多数任务的SQL查询。CRUD更加简单,支持in-place update:只要定义一个数组,然后传递给MongoDB的insert/update方法就可自动插入或更新;对于更新模式,MongoDB支持一个upsert选项,即:“如果记录存在那么更新,否则插入”。MongoDBupdate方法还支持Modifier,通过Modifier可实现在服务端即时更新,省去客户端和服务端的通讯。这些modifer可以让MongoDB具有和Redis、Memcached等KV类似的功能:较之MySQL,MonoDB更加简单快速。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值