这里主要介绍和记录一些有关MongoDB的常见语句。主要包括插入、查询、更新和删除。文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。

插入

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:

db.COLLECTION_NAME.insert(document)

实例

以下文档可以存储在 MongoDB 的 test 数据库 的 col集合中:

db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

以上实例中 col 是集合名,之前已经创建过了,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

查询

MongoDB 查询数据的语法格式如下:

db.COLLECTION_NAME.find()

find() 方法以非结构化的方式来显示所有文档。如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

db.col.find().pretty()

pretty() 方法以格式化的方式来显示所有文档。

实例

以下实例我们查询了集合 col 中的数据:

db.col.find().pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作 格式 范例 RDBMS中的类似语句
等于 { key : value } db.col.find({“title”:”MongoDB 教程”}).pretty() where by = ‘MongoDB 教程’
小于 { key :{$lt:value}} db.col.find({“likes”:{$lt:50}}).pretty() where likes < 50
小于或等于 {key:{$lte:value}} db.col.find({“likes”:{$lte:50}}).pretty() where likes <= 50
大于 {key:{$gt:value}} db.col.find({“likes”:{$gt:50}}).pretty() where likes > 50
大于或等于 {key:{$gte:value}} db.col.find({“likes”:{$gte:50}}).pretty() where likes >= 50
不等于 {key:{$ne:value}} db.col.find({“likes”:{$ne:50}}).pretty() where likes != 50
  • MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件。
语法格式如下:

db.col.find({ key1:value1, key2:value2 }).pretty()
  • MongoDB OR 条件

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

db.col.find({ $or: [{key1: value1}, {key2:value2}]} ).pretty()

OR和AND条件两者也可以同时使用

更新

MongoDB 使用 update()save() 方法来更新集合中的文档。

update() 方法

用于更新已存在的文档。语法格式如下:

db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>})

参数说明:

  • query : update的查询条件,与上述的find()方法相同。
  • update : update的对象和一些更新的操作符(如$,$inc…)等。
  • upsert : 可选,该参数是指,如果不存在update的记录,是否插入一个新的对象,默认是false,不插入。
  • multi : 可选,是指只更新找到的第一条记录,如果为true,则更新按条件查出来多条记录,默认是false。
  • writeConcern :可选,抛出异常的级别。

操作符:

  • $set 用来指定一个键的值。存在,则修改它,不存在,则创建它。

    db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

  • $unset 从文档中移除指定的键。

    db.col.update({"_id" : ObjectId("56063f17ade2f21f36b03133")},{"$unset" : {"description" :1 }} )

  • $inc 修改器用来增加已有键的值,或者在键不存在时创建一个键。$inc就是专门来增加数字的。”$inc”只能用于整数、长整数或双精度浮点数(如果需要减小值,只要将整数修改为负数)。要是用在其他类型的数据上就会导致操作失败。

    db.col.update({"_id" : ObjectId("56063f17ade2f21f36b03133")}, {"$inc":{"likes":-10}})

  • $rename 操作符可以重命名字段名称,新的字段名称不能和文档中现有的字段名相同。若相同则会删除现有字段,然后将需要修改的字段修改为新字段。若指定的字符不存在则不动作。

    {$rename: { <old name1>: <new name1>, <old name2>: <new name2>, ... } }

    当重命名子文档字段名时需要使用”.”操作符,格式:值为该子文档的字段名.子文档中字段名。

    db.col.update({"_id" : ObjectId("56063f17ade2f21f36b03133")}, { $rename: { "name.first": "name.fname" } } )

    $rename操作符也可以将子文档中键值移到其他子文档中。

实例

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   // 输出信息

save() 方法

通过传入的文档来替换已有文档。语法格式如下:

db.collection.save( <document>,{ writeConcern: <document> } ) 

参数说明:

  • document : 文档数据。
  • writeConcern :可选,抛出异常的级别。

实例

以下实例中我们替换了 _id 为 56063f17ade2f21f36b03133 的文档数据:

db.col.save({
    "_id" : ObjectId("56063f17ade2f21f36b03133"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})

删除

MongoDB remove()函数是用来移除集合中的数据。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

db.collection.remove(<query>, <justOne>)
// 如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
db.collection.remove(<query>, {justOne: <boolean>, writeConcern: <document> } )

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern :(可选)抛出异常的级别。

如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

db.col.remove({})

实例

db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 1 })           // 删除了一条数据

数据迁移备份

MongoDB数据迁移主要用到两个命令,一个是备份命令mongodump,一个是恢复命令mongorestore

mongodump:

在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。mongodump命令可以通过参数指定导出的数据量级转存的服务器。

在MongoDB处于连接状态下,执行下列命令,命令格式:

mongodump -h 'dbhost'  -d 'dbname' -o 'dbdirectory'

# -h:  mongodb所在服务器地址,例如127.0.0.1,也可以指定端口:127.0.0.1:27017 
# -d:  需要备份的数据库名称,例如:test_data
# -o:  备份的数据存放的位置,例如:/home/bak(需要提前新建)
# -u:  用户名称,使用权限验证的mongodb服务,需要指明导出账号
# -p:  用户密码,使用权限验证的mongodb服务,需要指明导出账号密码

如下:

本人没有指定文件夹,则在根文件夹内会自动创建一个dump文件夹,用于存储数据

mongorestore:

mongodb使用 mongorestore 命令来恢复备份的数据。

在MongoDB处于连接状态下,执行下列命令,命令格式:

mongorestore -h 'dbhost' -d 'dbname' --dir 'dbdireactory'

# -h:  mongodb所在服务器地址
# -d:  需要恢复备份的数据库名称,例如:test_data,可以跟原来备份的数据库名称不一样
# --dir: 备份数据所在位置,例如:/home/bak/test,mongoDB-3.0之前版本是用`-directoryperdb`
# -drop: 加上这个参数的时候,会在恢复数据之前删除当前数据;

如下图:

这样数据就恢复到新的MongoDB内了。

参考