mongodb 重温之路 ( 二 )

插入文档

mongodb 查询使用 find() 方法。

db.collection.find(query, projection)

* query    可选,使用查询操作符指定查询条件
* projection    可选,使用投影操作符指定返回的键
 

// 如果想以易读的方式读出,使用 `pretty()`
db.col.find().pretty()


// 除了find() 之外还有 findOne() 顾名思义是只找一个

AND

db.col.find({"title":"zjj" , "sex":"男"})

OR

db.col.find({$or[{key: val1}, {key1: val2}]})

OR 和 AND

db.col.find({"like": {$gt: 50}, $or:[{"by":"zjj"},{"title":"zjjasdada"}]})

条件操作符

一、查询于投影

1.1 比较运算符
$eq
// =
// 查询 age = 20
db.person.find({ age: { $eq: 20 } })
// 相当于
db.person.find({age: 20})
$gt
// >
// 查询 age > 20
db.person.find({age: {$gt: 20}})
$lt
// <
// 查询 age < 20
db.person.find({age: {$lt: 20}})
$gte
// >=
// 查询 age >= 20
db.person.find({age: {$gte: 20}})
$lte
// <=
// 查询 age <= 20
db.person.find({age: {$lte: 20}})
$ne
// ≠
// 查询 age ≠ 20
db.person.find({age: {$ne: 20}})
$in
// ≠
// 匹配数组中的任一值
db.person.find({qyt: {$in :[5, 12]}})
$nin
// nin
// 不匹配数组中的值
db.person.find({qty : {$nin: [2,322]}})
1.2 逻辑运算符
$or
// 或 条件查询
db.person.find({$or: [{age: {$lt: 20}},{address: "beijing"}]})
$and
// 且 条件查询
db.person.find({$and: [{age: {$lt: 20}},{address: "beijing"}]})
$not
// 查询与表达式不匹配的文档
db.person.find({age: {$not: {$gt: 20}}});
$nor
// 查询与任一表达式都不匹配的文档
db.col.find({$nor: [{age: 20}, {sex: "男"}]}})
1.3 元素运算符
$exists
// 查询存在指定字段的文档
// 查询存在phone字段的文档:  
db.col.find({phone: {$exists: true}})
$type
// 查询类型为指定类型的文档,3.2版本添加alias别名,各种类型的Number及Alias如下

mongodb  重温之路 ( 二 )

// 假设有
{ "_id": 1, address: "2030 Martian Way",zipCode: "90698345"},  
{ "_id": 2, address: "156 Lunar Place",zipCode: 43339374},  
{ "_id": 3, address: "2324 Pluto Place",zipCode: NumberLong(3921412)},  
{ "_id": 4, address: "55 Saturn Ring", zipCode: NumberInt(88602117)} 

// 查询该集合中zipCode字段的数据类型为String类型的文档:
db.col.find({zipCode: {$type: "string"}});
db.addressBook.find( { "zipCode" : { $type : 2 } } );
1.4 元素运算符
$mod
// 取余条件查询
// 查询age字段的值除以2余0的文档:  
db.person.find( { age: {$mod : [2, 0] } } )
$regex
// 正则表达式查询 
db.person.find({sku: {   $regex: /^ABC/i  }})
$text
// 文本索引查询
{  
    $text: {  
        $search: <string>,  
        $language: <string>,  
        $caseSensitive: <boolean>,  
        $diacriticSensitive: <boolean>  
    }  
}

// 具体请查看官方文档
$where
// 可以支持字符穿或者是函数
db.myCollection.find( { $where: "this.credits == this.debits" } );  
db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
1.5 数组操作符
$all
// 匹配文档的数组字段中包含所有指定元素的文档

查询articles集合中tags字段(是个数组)包含“ssl”和“security”的文档(包含,但并不是全部等于)  
db.articles.find({tagS: { $all:[ ["aal", "dsada"] ] }  })
$elemMatch()
匹配内嵌文档或数组中的部分field
// 假设有
{ _id: 1, results: [ 82, 85, 88 ] }  
{ _id: 2, results: [ 75, 88, 89 ] }  


db.col.find({results: { $elemMatch: { $gte: 80, $lt: 85} }  });
// 查询results数组中含有区间[80,85)元素的文档(结果为第一条);
$size
// 匹配数组长度为指定大小的文档
查询已经集齐了5张福卡的文档:  
db.person.find({card:{$size:5}})
1.6投影操作符
$(projection)
//查询数组中首个匹配条件的元素,相当于findOne()方法
{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }  
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }  
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }  
{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }  
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }  
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] } 

db.student.find({semester : 1 ,  grades: {$gte: 85}}, {"grades.$": 1});
查询semester=1,并且grades中符合大于等于85的元素的第一个元素:

// 查询结果是
{ "_id" : 1, "grades" : [ 87 ] }
{ "_id" : 2, "grades" : [ 90 ] }
{ "_id" : 3, "grades" : [ 85 ] }
$(projection)
{  
 _id: 1,  
 zipcode: "63109",  
 students: [  
              { name: "john", school: 102, age: 10 },  
              { name: "jess", school: 102, age: 11 },  
              { name: "jeff", school: 108, age: 15 }  
           ]  
}  
{  
 _id: 2,  
 zipcode: "63110",  
 students: [  
              { name: "ajax", school: 100, age: 7 },  
              { name: "achilles", school: 100, age: 8 },  
           ]  
}  
{  
 _id: 3,  
 zipcode: "63109",  
 students: [  
              { name: "ajax", school: 100, age: 7 },  
              { name: "achilles", school: 100, age: 8 },  
           ]  
} 
//查询zipcode为63109并且students数组中school=102的文档:

db.school.find({ zipcode: "63109" }, {student: { $elemMatch: { school: 102 } } } )

// result
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
{ "_id" : 3 }
$slice
// 在查询中将数组进行切片(类似于分页)
(1)查询结果中,对于comments数组的元素只显示前5个:  
db.posts.find( {}, { comments: { $slice: 5 } } )  
(2)查询结果中,对于comments数组的元素只显示后5个:  
db.posts.find( {}, { comments: { $slice: -5 } } )  
(3)查询结果中,对于comments数组的元素跳过(skip)前20个,并只显示(limit)10个元素(即21-30):  
db.posts.find( {}, { comments: { $slice: [ 20, 10 ] } } )  
(4)同理,跳过后20个,并显示10个:  
db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )
skip 和 Limit

limit

// 获取20条
db.things.find().limit(20);

limit

// 跳过20.再选20条
db.things.find().skip(20).limit(20)
排序
db.things.find().sort({"likes":-1})         -1表示倒序排列

相关推荐