【Mongodb常规操作 01】

一、简介

1、什么是MongoDB

c++语言编写的,是一个基于分布式文件存储的开源数据库系统;为web应用提供可扩展的高性能数据存储解决方案;

MongoDB将数据存储为一个文档,数据结构由键值对(k-v)组成。MongoDB文档类似于json对象。字段值可以包含其他文档,数组及文档数组

 

2、安装MongoDB

1)拉取镜像

docker pull mongo:latest

2)创建和启动容器

docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo

3)进入容器

docker exec -it 5bf2ba713cbb /bin/bash

5bf2ba713cbb 容器id

4)使用MongoDB客户端进行操作

mongo

5)查询所有数据库

6)查询所有集合(表)

show collections

二、简单命令操作

1、MongoDB概念

MongoDB中基本的概念是文档、集合、数据库;

下表将帮组您更容易理解mongo中的一些概念

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table(表)

collection(集合)

数据库表/集合

row(行)

document(文档)

数据记录行/文档

column(列)

field(字段)

数据字段/域

index(索引)

index(索引)

索引

table joins

 

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

2、MongoDB-database(数据库)

一个MongoDB中可以建立多个数据库

常用操作

1、 Help查看命令提示 
db.help();
2、 切换/创建数据库
use test
如果数据库不存在,则创建数据库,否则切换到指定数据库
3、 查询所有数据库 
show dbs;
4、 删除当前使用数据库 
db.dropDatabase();
5、 查看当前使用的数据库 
db.getName();
6、 显示当前db状态 
db.stats();
7、 当前db版本 
db.version();
8、 查看当前db的链接机器地址 
db.getMongo〇;
9、查看当前库内的所有集合(表)
show collections

3、MongoDB-document(文档)

文档是一组键值(key-value)对(即 BSON),MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongDB非常突出的特点。

需要注意的是:

  •  文档中的键/值对是有序的。
  • 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)
  • MongoDB区分类型和大小写。
  • MongoDB的文档不能有重复的键。
  • 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
  • .$有特别的意义,只有在特定环境下才能使用。
  • 以下划线"_"开头的键是保留的(不是严格要求的)

4、MongoDB-collection(集合)

常用命令:

1、 创建一个集合(table)

db.createCollection( "collName");

2、 得到指定名称的集合(table )

db.getCollection("user");

5、常用命令

1)insert

> db.User.save({name:'zhangsan',age:21,sex:true})
> db.User.find()
{"_id": Objectld("4f69e680c9106ee2ec95da66"), "name": "zhangsan", "age": 21,
"sex": true}

User:代表集合

2)query查询

查询集合下的所有数据

> db.User.find()

where

# select * from User where name = 'zhangsan'
> db.User.find({name:"zhangsan"})

fields

# select name, age from User where age = 21
> db.User.find({age:21}, {'name':1, 'age':1})

sort排序 -->1升序,-1降序

# select * from User order by age
> db.User.find().sort({age:1})

suce --> MongoDB 中使用 limit()方法来读取指定数量的数据,skip()方法来跳过指定数量的数据

# select * from User skip 2 limit 3
> db.User.find().skip(0).limit(3)

in

# select * from User where age in (21, 26, 32)
> db.User.find({age:{$in:[21,26,32]}})

count

# select count(*) from User where age >20
> db.User.find({age:{$gt:20}}).count()

or

# select * from User where age = 21 or age = 28
> db.User.find({$or:[{age:21}, {age:28}]})

3)Update

可直接用类似T-SQL条件表达式更新,或用SaveO更新从数据库返回到文档对象。
# update Userset age = 100, sex = 0 where name = 'user1'
> db.User.update({name:"zhangsan"}, {$set:{age:100, sex:0}})

Update()有几个参数需要注意。
db.collection.update(criteria, objNew, upsert, mult)
criteria:需要更新的条件表达式
objNew:更新表达式
upsert:如FI标记录不存在,是否插入新文档。 
multi:是否更新多个文档。

4)remove

removeO用于删除单个或全部文档,删除后的文档无法恢复。

> db.User.remove(id)
//移除对应id的行
> db.User.remove({})
//移除所有

5)aggregate

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)

插入数据

>db.article.insert({
    title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
})
>db.article.insert({
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
})
>db.article.insert({
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
})

 统计sum

# select by_user, count(*) from article group by by_user
> db.article.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

{
"result" : [
      {
"_id" : "runoob.com",
"num_tutorial" : 2
      },
      {
"_id" : "Neo4j",
"num_tutorial" : 1
      }
   ],
"ok" : 1
}

在上面的例子只能怪,我们通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和

常见聚合表达式

表达式

描述

实例

$sum

计算总和。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])

$avg

计算平均值

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])

$min

获取集合中所有文档对应值得最小值。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])

$max

获取集合中所有文档对应值得最大值。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])

$push

在结果文档中插入值到一个数组中。

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])

$addToSet

在结果文档中插入值到一个数组中,但不创建副本。

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

$first

根据资源文档的排序获取第一个文档数据。

db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

$last

根据资源文档的排序获取最后一个文档数据

db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

6)索引

>db.User.createIndex({"name":1})

语法中 name值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可

7)实际工作中用到的语句

//查询-按时间倒序排序
db.ua_click_indexes.find({"channel_id":'514'}).sort({"createDate":-1})

//插入语句
db.ua_click_indexs.insert(
        {
            _id: 'd38b259e582bdde8:BDFE7F94-5E16-4D9F-9242-71EF1CB5392Q:idfa',
            index: '4C57690C8FA2882FFFC2854F9655C1AC',
            ry_touchpoint_ts: Long("1684227178401"),
            device_type: 'idfa',
            channel_id: '514',
            createDate: ISODate("2023-05-16T08:52:59.127Z")
        }
    )

//修改语句
db.ua_click_indexes.updateOne({clickid : "d38b259e582bdde8:33DAF16C-D1EA-E82B-4C29-6AC283F55D2E:idfa",channel_id:'2586'},
{$set: {indexes_params: 
    [
      {
        num: 0,
        index: '97903AC19D37F98D7E59E51A56683470',
        ry_touchpoint_ts: Long("1687756701000")
      }
    ]
}});


db.ua_click_vals.updateOne({_id: "E43A2D38EDB3BB20BB819524FAFD0A9C"},
{$set: {hasMatched: false}});

 

posted @ 2023-01-13 10:44  尘封~~  阅读(50)  评论(0编辑  收藏  举报