介绍一下MongoDB基本文档操作
MongoDB的数据存储格式是类js中的json格式,文档操作也就与sql语句的差别很大,这种格式对于常年使用关系型数据库的开发者来说可能有些不适应,接下来简单介绍一下MongoDB中的文档操作
使用find查询文档
关于find
find是MongoDB中查询的基本指令,相当于sql中的select
find返回的是游标
find示例
db.orders.find({"time":"2001"})//单条件查询
db.orders.find({"time":"2001","remark":"加糖"})//多条件and查询
db.orders.find({$and:[{"time":"2001"},{"remark":"加糖"}]})//and的另一种形式
db.orders.find($or:[{"phone":"18338611760"},{"username":"wang"}])//多条件or查询
db.orders.find({"title":/^B/})按照正则表达式查找
查询对照表
sql中的查询mql中也有一一对照
| sql | mql |
|---|---|
| a=1 | {a:1} |
| a<>1 | {a: { $ne : 1} |
| a>1 | {a: { $gt : 1} |
| a>=1 | {a: { $gte : 1} |
| a<1 | {a: { $lt : 1} |
| a<=1 | {a: { $lte : 1} |
以下还有一些复杂一点的情况
| sql | mql |
|---|---|
| a=1 AND b=1 | {a:1,b:1} 或 {$and : [{a : 1},{b : 1}]} |
| a=1 OR b=1 | {a:1,b:1} 或 {$or : [{a :1 },{b : 1}]} |
| a IS NULL | $exists : false |
| a IN (1,2,3) | a : {$in : [1,2,3]} |
同时还有更多的细节可以在MongoDB官方文档查到
使用find搜索子文档
可以搜索文档中的子文档
find支持使用"field.sub_field"的形式查询子文档。假设有一个文档:
db.users.insertOne({
name:"张三",
from:{
address:"广东",
country:"china"
}
})
以下查询可以通过from中的adress或country字段查到张三
db.users.find({"from.address":"广东"})
接下来还有一种错误的演示,下面的执行会返回null,熟悉javascript的同学惊呼内行
db.users.find({"from":{country:"china"})
使用find来搜索数组
find支持对数组中元素进行搜索,假设有一个文档
db.users.insert([
{name:"lisi",like:["听音乐","玩游戏"]},
{name:"zhangsan",like:["学习","上网"]}
])
查找喜欢听音乐的用户
db.users.find({like:"听音乐"})
查到结果为
{
_id: ObjectId("634b6446ac8b0d1547694142"),
name: 'lisi',
like: [ '听音乐', '玩游戏' ]
}
查找喜欢听音乐或者喜欢上网用户
db.users.find({$or:[{like:"听音乐"},{like:"上网"}]})
查询结果为
{ _id: ObjectId("634b6446ac8b0d1547694142"),
name: 'lisi',
like: [ '听音乐', '玩游戏' ] }
{ _id: ObjectId("634b6446ac8b0d1547694143"),
name: 'zhangsan',
like: [ '学习', '上网' ] }
使用 find 搜索数组中的对象
考虑以下文档,在其中搜索
db.movies.insertOne( {
"title" : "Raiders of the Lost Ark",
"filming_locations" : [
"USA" }, { "city" : "Los Angeles", "state" : "CA", "country" :
{ "city" : "Rome", "state" : "Lazio", "country" : "Italy" },
{ "city" : "Florence", "state" : "SC", "country" : "USA" }
]
})
查找城市是 Rome 的记录
db.movies.find({"filming_locations.city": "Rome"})
在数组中搜索子对象的多个字段时,如果使用 $elemMatch,它表示必须是同一个子对象满足多个条件。考虑以下两个查询:
db.getCollection('movies').find({
"filming_locations.city": "Rome",
"filming_locations.country": "USA"
})
db.getCollection('movies').find({
"filming_locations": {
$elemMatch:{"city":"Rome", "country": "USA"}
}
})
以上两者的结果一致
控制 find 返回的字段
● find 可以指定只返回指定的字段;
● _id字段必须明确指明不返回,否则默认返回;
● 在 MongoDB 中我们称这为投影(projection);
● db.movies.find({"category": "action"},{"_id":0, title:1})
表示从电影里找到动作片,但是只想返回电影名字
0表示不返回该字段,1表示返回,默认都是返回的