MongoDB系列二

简介

     MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

   MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。

     MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似 json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

    传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库 (database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

特点

  它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  1)面向集合存储,易存储对象类型的数据。

  2)模式自由。

  3)支持动态查询。

  4)支持完全索引,包含内部对象。

  5)支持查询。

  6)支持复制和故障恢复。

  7)使用高效的二进制数据存储,包括大型对象(如视频等)。

  8)自动处理碎片,以支持云计算层次的扩展性。

  9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

  10)文件存储格式为BSON(一种JSON的扩展)。

  11)可通过网络访问。

各文件功能

Mongod.exe 是用来连接到mongo数据库服务器的,即服务器端。

Mongo.exe 是用来启动MongoDB shell的,即客户端。

mongodump 逻辑备份工具。

mongorestore 逻辑恢复工具。

mongoexport  数据导出工具。

mongoimport  数据导入工具。

安装MongoDB

mongod --dbpath D:\MongoDB\data --logpath=D:\MongoDB\logs\mongodb.log --logappend

MongoDB Windows环境安装及配置  这篇文章介绍windows下安装MongoDB不错

C#中使用的MongoDB DLL驱动

 MongoDB.Driver.dll:顾名思义,驱动程序

 MongoDB.Bson.dll:序列化、Json相关

下载地址 http://files.cnblogs.com/files/liyunhua/MongoDBDll.zip

最最常用命令

use cnblogs // use 命令用来切换当前数据库,如果该数据库不存在,则会先新建一个。
show dbs // 显示所有数据库
show collections // 显示当前数据库下的所有集合
db.users.drop() // 删除collection 如果删除成功会返回“true”,否则返回“false”
db.dropDatabase()//删除当前数据库

 

简单的说一下增加、修改、删除

db.users.insert({'name':'angela','sex':'feman'})// 这条命令是向users 集合中插入一条数据。如果集合users不存在,则会先新建一个,然后再插入数据,参数以JSON格式传入。
db.users.update({'name':'xiangshu'},{'$set':{'sex':'women'}},upsert=true,multi=false)//解释一下几个参数: 第一:查询的条件、 第二:更新的字段、 第三:如果不存在则插入 第四:是否允许修改多条记录
db. users.remove({'name':'xumingxiang'})//删除记录  如果remove方法里面不传入任何参数则删除所有数据  清除集合中的所有数据,但是不会删除集合本身以及关联的索引
db.users.find() //查找

 细说上述update方法,上面update第三个参数是upsert,upsert操作就是说:如果我没有查到,我就在数据库里面新增一条,其实这样也有好处,就是避免了我在数据库里面判断是update还是add操作,使用起来很简单

默认情况下update方法是整体更新,如果需要局部更新,mongodb中已经给我们提供了两个修改器: $inc 和 $set。

$inc修改器也就是increase的缩写,

每次修改会在原有的基础上自增$inc指定的值,$inc修改符将匹配条件的文档的age键原子加一,缺省情况下只是更新第一条符合条件的文档。可以通过update函数的最后一个参数来指定更新所有符合条件的文档

$set修改直接修改匹配文档的内容,如果修改的键存在则直接修改,否则新增。$unset修改符合$set的功能是完全相反的

具体复杂点的操作见Mongo学习笔记数据操作

详述查找命令

上面例子中的findOne方法是查询出第一条语句。

一般的查询条件有and、or 、in、not in、not

 db.person.find({"name":"jack","age":25})//相当于查询name="jack" and age=25
db.person.find({ $or: [{ "name": "jack", "age": 25 }] })//相当于查询name="jack" or age=25
db.person.find({ "name": { $in: ["jack", "joe"] } })//相当于查询name in("jack","joe")

和sql server不一样的是MongoDB的in list中的数据可以是不同类型。

db.person.find({ "name": { $nin: ["jack", "joe"] } })//相当于查询name not in("jack","joe")
db.person.find({ "$or": [{ "name": { "$in": ["jack", "joe"] } }, { "age": 25 }] })//如何混合使用$or和$in。
db.person.find({ "name": { "$not": { "$in": ["jack", "joe"] } } })//$not表示取反,等同于SQL中的not。

下面是查询的相关......

 db.person.find({}, {"name":1})//返回指定的文档键值对。只是返回name的键值对。
 db.person.find({}, {"name":0})//指定不返回的文档键值对。返回除name之外的所有键值对。

 那如果需要查询一些特定条件的 事实上是可以用正则的,看下面的例子。

db.person.find({ "name": /^j/, "name": /e$/ });//查询name startwith 'j' and endwith 'e'

有些查询很复杂的话,$where派上用场了。

db.person.find({ $where: function () { return this.name == 'jack'; } })//查询name='jack'

 下面说说比较运算符。

$lt/$lte/$gt/$gte/$ne,依次等价于</<=/>/>=/!=。(l表示less g表示greater e表示equal n表示not  )

 

db.person.find({ "age": { "$gte": 18, "#lte": 40 } });//返回符合条件age >= 18 && age <= 40

 

db.person.find({ "name": { "$ne": "jack" } })//返回条件符合name != "jack"

我相信大家在查询数据的时候经常会碰到null,下面来说说null数据类型的查询吧

db.person.find({"name":null})//在进行值为null数据的查询时,所有值为null,以及不包含指定键的文档均会被检索出来。
db.person.find({"name": {"$in": [null], "$exists":true}})
//需要将null作为数组中的一个元素进行相等性判断,即便这个数组中只有一个元素。再有就是通过$exists判断指定键是否存在。

mongodb跟sqlserver数据查询还是有很大不相同的一部分的,最显著不一样的地方就是MongoDb中的数组数据查询。

具体来说说吧。现在假设我们数据库里面查询出来的数据如下图所示:

db.test.find({"fruit":"banana"})//数组中所有包含banana的文档都会被检索出来。
db.test.find({"fruit": {"$all": ["banana","apple"]}})//检索数组中需要包含多个元素的情况,这里使用$all。数组中必须同时包含apple和banana,但是他们的顺序无关紧要。
db.test.find({"fruit":["apple","banana","peach"]})//精确匹配,即被检索出来的文档,fruit值中的数组数据必须和查询条件完全匹配,即不能多,也不能少,顺序也必须保持一致。
db.test.find({"fruit.2":"peach"})//匹配数组中指定下标元素的值。数组的起始下标是0。 查看出fruit数组中第二个元素的值为peach
db.test.find({"fruit": {$size : 3}})//可以通过$size获取数组的长度,但是$size不能和比较操作符联合使用。就是说查询出fruit长度为3的...

上述的例子是查询fruit数组长度为3的,那如果需要查询长度大于3的应该怎么办呢

db.test.update({}, {"$set": {"size":3}},false,true)//只能是添加一个额外的键表示数据中的元素数据,在操作数据中的元素时,需要同时更新size键的值。
test.update({},{"$push": {"fruit":"strawberry"},"$inc":{"size":1}},false,true)//$inc每次添加一个新元素,都要原子性的自增size一次。
db.test.find({},{"fruit": {"$slice":2}, "size":0})//通过$slice返回数组中的部分数据。"$slice":2表示数组中的前两个元素。"$slice":-2表示数组中的后两个元素。$slice : [2,1],表示从第二个2元素开始取1个,如果获取数量大于2后面的元素数量,则取后面的全部数据。

大家都知道,MongoDB是由数据库 (database)、集合(collection)、文档对象(document)三个层次组成。当一个文档对象中包含另外多个文档对象的时候,应该怎么查询呢?

这时候$elemMatch就有用武之地了。

假设我们数据库里面数据如下图所示

db.person.find({"comments": {"$elemMatch": {"author":"joe","score":{"$gte":3}}}}

 

转载于:https://www.cnblogs.com/liyunhua/p/4621907.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11的静态断言

断言就是将一个返回值总是需要为真的判别式放在语句中&#xff0c;来排除在设计的逻辑上不应该出现的情况。C11标准中引入了静态断言&#xff1a;static_assert 在C标准中&#xff0c;<cassert>或assert.h为我们提供了assert宏&#xff0c;但是这个宏只有在运行时才进行…

C# DataTable去除重复,极其简便、简单

其中sourceDT是获取到的一个DataTable类型的集合对象 去重复使用方式&#xff1a; 实例化一个DataView对象 假设为dv&#xff0c;直接dv.ToTable()即可&#xff0c;ToTable中可为&#xff08;true,"用于判断重复的列"&#xff09;&#xff0c;比如图中所示&#xff0…

环形矩阵

1.逆时针 代码&#xff1a; 1 // huanxingjz.cpp : Defines the entry point for the console application.2 //3 4 #include "stdafx.h"5 #include <stdio.h>6 #include <iostream>7 #include "windows.h"8 #define MAX 409 using namespace …

Winsock网络编程笔记(4)----基本的理论知识

前面的笔记记录了Winsock的入门编程&#xff0c;领略了Winsock编程的乐趣。。但这并不能算是掌握了Winsock&#xff0c;加深理论知识的理解才会让后续学习更加得心应手。。因此&#xff0c;这篇笔记将记录一些有关Winsock的基本理论知识&#xff0c;由于是一篇笔记&#xff0c;…

Method Swizzle黑魔法,修改 ios 系统类库方法(转载)

一般来说&#xff0c;系统提供的方法已经足够开发了&#xff0c;但是有的时候有些需求用普通方法不好做。 如&#xff1a;在所有的viewcontroll 的viewwillappear&#xff1a;方法之前打个log 你可能会这么做&#xff1a; 1. 建一个uiviewcontroll 父类&#xff0c;重写viewwil…

win10无法开启夜间模式

在学校的时候没感觉&#xff0c;一进公司发现电脑还是需要设置一下护眼的&#xff0c;但是在设置的时候却遇到夜间模式无法开启的问题。 首先在左下角搜索设备管理器 找到显示适配器 查看显示器设备状态 如果设备图标上有黄三角感叹号则说明该设备驱动有问题&#xff0c;需要…

项目管理工具到底应该为谁服务?

项目管理工具到底应该为谁服务&#xff1f;为管理者&#xff0c;还是为了团队&#xff1b;为了管理报表&#xff0c;还是为了协作需求&#xff0c;这些是在项目管理工具选择或开发时需要面对和思考的一个问题。 传统项目管理工具在团队内部臭名昭著 项目管理工具当初都是为了项…

二叉树的递归定义及存储

定义 最多有两棵子树的有序树&#xff0c;称为二叉树。二叉树是一种特殊的树。 递归定义&#xff1a;二叉树是n(n>0)个有限结点构成的集合。N0称为空二叉树&#xff1b;n>0的二叉树由一个根结点和两互不相交的&#xff0c;分别称为左子树和右子树的二叉树构成。 二叉树中…

NetBpm 安装篇(1)

尊重别人劳动成果 转载注明出处&#xff1a;http://www.cnblogs.com/anbylau2130/p/3875718.html 官方主页 http://www.netbpm.org/docs/install.html 文件目录 Netbpm的两种服务器配置 1&#xff0c;CassiniWebServer CassiniWebServer.exe是轻量级的web服务器&#xff0c;相…

python将文本中的数据处理成图像(matplotlib)

使用Python的matplotlib模块可以很方便的将数据处理成图表&#xff0c;使数据更加形象、直观。 #!/usr/bin/env pythonimport matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid.anchored_artists import AnchoredTexty1np.loadtxt(ReadDataCostTime.…

交叉编译android版htop

编这个东西贼烦人。 话不多说&#xff0c;直接上教程 源代码版本&#xff1a;htop-2.2.0、ncurses-6.1 编译之前要确认自己有ndk&#xff0c;从【官网】直接下载&#xff0c;下载下来解压一下就能用。 先编ncurses 编译过程 ./configure CCarm-linux-androideabi-gcc-4.9 \-…

UITableView知识梳理须知—(一)

1、UITableView掌握 1> 设置UITableView的dataSource、delegate 2> UITableView多组数据和单组数据的展示 3> UITableViewCell的常见属性 4> UITableView的性能优化&#xff08;cell的循环利用&#xff09; 5> 自定义Cell 2、什么是UITableView 在i…

Yarn中的几种状态机

1 概述 为了增大并发性&#xff0c;Yarn采用事件驱动的并发模型&#xff0c;将各种处理逻辑抽象成事件和调度器&#xff0c;将事件的处理过程用状态机表示。什么是状态机&#xff1f; 如果一个对象&#xff0c;其构成为若干个状态&#xff0c;以及触发这些状态发生相互转移的事…

分支管理(转载)

转自&#xff1a;http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743862006503a1c5bf5a783434581661a3cc2084efa000 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习Git的时候&#xff0c;另一个你正在另一个平行…

分享一个用安卓手机就能引导pc安装linux系统办法

1、首先安卓手机下载软件DriveDroid.apk http://pan.baidu.com/s/1qW4pbT6 2、下载linux镜像文件放手机存储卡存储&#xff0c;放到Download/images/以下 3、打开软件会自己主动读取这个目录以下镜像&#xff0c;也能够在软件里面下载须要的镜像文件 4、软件设置usb连接模式 5、…

SharePoint 2013 开发——其他社交功能

博客地址&#xff1a;http://blog.csdn.net/FoxDave上一篇讲了如何获取用户配置文件的相关属性&#xff0c;它属于SharePoint 2013社交功能的一个小的构成部分。社交功能是SharePoint 2013改进的一大亮点。可以在现有网站上开启社交功能或者新建一个专门用于社交用途的社区网站…

第一个Qt+opencv程序

简单安装好Qt和编译安装好opencv后&#xff0c;简单实现第一个Qtopencv程序&#xff1a;读取并显示一张图片&#xff0c;这里我的Qt版本时5.9.1&#xff0c;opencv版本是4.0.1&#xff0c;版本的影响不大。 首先我们用Qt创建一个控制台项目&#xff0c;即在创建项目时选择Qt C…

redis学习笔记——应用场景

最近在看redis入门指南&#xff0c;现在就自己的学习情况说说自己的理解。 字符串类型&#xff08;String&#xff09; 字符串类型是Redis中最基本的类型&#xff0c;能存储任意形式的字符串&#xff0c;包括二进制数据。如一张照片也可以用字符串类型存储。注意字符串类型键允…

Graphviz从入门到不精通

1、安装Graphviz &#xff08;windows 版本&#xff0c;后面说linux下的安装&#xff09; 1.1&#xff09;下载安装文件 从graphviz官网下载 http://www.graphviz.org/Download.php 或者从我的百度网盘下载 http://pan.baidu.com/s/1i3mzunV 下载后双击安装&#xff0c;跟着提示…

HDU2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 39259 Accepted Submission(s): 16261 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…