时间:2022-12-08 12:55:39 | 栏目:mongodb | 点击:次
本篇文章中将讲解如何使用MongoDB操作文档。
文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式。BSON是一种类似json格式的一种二进制形式的存储格式,简称Binary JSON。
MongoDB使用insert()或save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
例如:以下文档可以存储在MongoDB的test数据库的MongoDBTest集合中:
{"title" : "MongoDB", "description" : "mongoDB是一个NoSql数据库", "tags" : "NoSql" }

在上面的例子中,MongoDBTest是我们的集合名,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档。doc是定义的变量,可以以变量的形式插入集合。
查看已经插入的文档:
> db.MongoDBTest.insert(doc)
WriteResult({ "nInserted" : 1 })
> db.MongoDBTest.find()
{ "_id" : ObjectId("5a6f13e72d0b37669c5d2a78"), "title" : "MongoDB", "description" : "mongoDB是一个NoSql数据库", "tags" : "NoSql" }
>
插入文档也可以使用save()方法。如果不知道_id字段save()方法类似于insert()方法。如果指定_id字段,则会更新该_id的数据。
下面的例子表示使用save()命令更新数据:

MongoDB查询文档使用find()方法。
find()方法以非结构化的方式来显示所有文档。
MongoDB查询数据的语法格式如下:
db.collection.find(query,projection)
参数说明:
如果你需要格式化读取的数据,可以使用pretty()方法,语法格式如下:
db.collection.find().pretty()
pretty()方法以格式化的方式来显示所有文档。
例如:查询Student集合中的所有文档。

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

MongoDB与RDBMS where语句比较
如果你熟悉常规的SQL数据,通过下表可以更好的理解MongoDB的条件语句查询:
| 操作 | 格式 | 范例 | RDBMS中的类似语句 |
| 等于 | {<key>:<value>} | db.Student.find({"name":"张三"}).pretty() | where name='张三' |
| 小于 | {<key>:{$lt:<value>}} | db.Student.find({"score":{$lt:"80"}}).pretty() | where score<80 |
| 小于或等于 | {<key>:{$lte:<value>}} | db.Student.find({"score":{$lte:"80"}}).pretty() | where score<=80 |
| 大于 | {<key>:{$gt:<value>}} | db.Student.find({"score":{$gt:"80"}}).pretty() | where score>80 |
| 大于或等于 | {<key>:{$gte:<value>}} | db.Student.find({"score":{$gte:"80"}}).pretty() | where score>=80 |
| 不等于 | {<key>:{$ne:<value>}} | db.Student.find({"score":{$ne:"80"}}).pretty() | where score!=80 |
(1)查询name是张三的学生
db.Student.find({"name":"张三"}).pretty()
查询结果如下图所示:

(2)查询成绩小于80的学生
db.Student.find({"score":{$lt:"80"}}).pretty()
查询结果如下图所示:

(3)查询成绩小于等于80的学生
db.Student.find({"score":{$lte:"80"}}).pretty()
查询结果如下图所示:

(4)查询成绩大于80分的学生
db.Student.find({"score":{$gt:"80"}}).pretty()

(5)查询成绩大于等于80分的学生
db.Student.find({"score":{$gte:"80"}}).pretty()
查询结果如下图所示:

(6)查询成绩不等于80分的学生
db.Student.find({"score":{$ne:"80"}}).pretty()
查询结果如下图所示:

MongoDB的find()方法可以传入多个键(key),每个键(key)以逗号分隔开,等价于常规SQL的AND条件。
语法格式如下:
db.collection.find({key1:value1,key2:value2}).pretty()
例如:查询姓名为张三并且课程是C#程序设计的学生信息。
db.Student.find({"name":"张三","subject":"C#程序设计"}).pretty()
查询结果如下图所示:

以上实例中类似于RDBMS中的where语句:WHERE name='张三' AND subject='C#程序设计'。
MongoDB的OR条件语句使用了关键字$or,语法格式如下:
>db.collection.find(
{
$or:[
{key1:value1},{key2:value2}
]
}
)
例如:查询姓名是李四或者成绩等于80的学生
db.Student.find({$or:[{"name":"李四"},{"score":"80"}]}).pretty()
查询结果如下图所示:

MongoDB使用update()和save()方法来更新集合中的文档。接下来让我们详细来看下两个方法的应用及其区别。
update()方法用于更新已经存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
参数说明:
writeConcern的几种抛出异常的级别参数
例如:使用update()方法更新标题(title)

上面的语句只会更新第一条查询到的文档,如果你要更新多条相同的文档,则需要设置multi参数为true。
如果要更新的数据不存在,upsert参数设置为true则会插入数据。

save()方法通过传入的文档来替换已有文档,语法格式如下:
db.collection.save(
<document>,
{
writeConcern:<document>
}
)
参数说明:
例如:更新_id=5a702a7f2c6ed8f4d3491831的文档。

MongoDB使用remove()方法来移除集合中的数据。
注意:在执行remove()方法前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
remove()方法的基本语法格式如下:
db.collection.remove( <query>, <justOne> )
如果MongoDB是2.6版本以后的,语法格式如下:
db.collection.remove(
<query>,
{
justOne:<boolean>,
writeConcern:<document>
}
)
参数说明:
实例

如果想删除所有数据,可以使用下面的例子
