MongoDB文档基本操作--查询文档

140 阅读2分钟

介绍一下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中也有一一对照

sqlmql
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}

以下还有一些复杂一点的情况

sqlmql
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表示返回,默认都是返回的