MongoDB查询语法
mongo查询
项⽬中经常⽤到MongoEngine,对于⼀些复杂的查询语句,⽆论在性能还是写法上mongo都会优于ORM,所以学习下mongo的基本查询⽅法,可以结合MongoEngine的__raw__来使⽤,MongoEngine结合pymongo⽰例可以看
⽂章⽬录
1. 正则
可使⽤正则$regex查询、匹配结果
> db.posts.find({post_text:{$regex:"w3cschool"}})
> db.posts.find({post_text:/w3cschool/})
不区分⼤⼩写
> db.posts.find({post_text:{$regex:"w3cschool",$options:"$i"}})
数组匹配正则
{
"_id" : ObjectId("53493d37d852429c10000004"),
"tags" : ["tutorialspoint"]
}
> db.posts.find({tags:{$regex:"tutorial"}})
2. 聚合/管道
常见的聚合表达式:
表达式描述实例
$sum计算总和。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {likes"}}}])
$avg计算平均值db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {likes"}}}])
$min 获取集合中所有⽂档对应值得最⼩
值。
{_id : "by_user", num_tutorial : {likes"}}}])
$max 获取集合中所有⽂档对应值得最⼤
值。
{_id : "by_user", num_tutorial : {likes"}}}])
$push 在结果⽂档中插⼊值到⼀个数组
中。
{_id : "by_user", url : {url"}}}])
$addToSet
在结果⽂档中插⼊值到⼀个数组
中,但不创建副本。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {url"}}}])
$first 根据资源⽂档的排序获取第⼀个⽂
档数据。
{_id : "by_user", first_url : {url"}}}])
$last 根据资源⽂档的排序获取最后⼀个db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup :
{_id : "by_user", last_url : {url"}}}])
sum:"
avg:"
min:"
max:"
push:"
addToSet:"
first:"
last:"
$last ⽂档数据{_id : "by_user", last_url : {url"}}}])
表达式
描述
实例
MongoDB的聚合管道将MongoDB⽂档在⼀个管道处理完毕后将结果传递给下⼀个管道处理。管道操作是可以重复的。表达式:处理输⼊⽂档并输出。表达式是⽆状态的,只能⽤于计算当前聚合管道的⽂档,不能处理其它的⽂档。聚合框架中常⽤的⼏个操作:
$project:修改输⼊⽂档的结构。可以⽤来重命名、增加或删除域,也可以⽤于创建计算结果以及嵌套⽂档。$match:⽤于过滤数据,只输出符合条件的⽂档。m atch使⽤MongoDB的标准查询操作。$limit:⽤来限制MongoDB聚合管道返回的⽂档数。
$skip:在聚合管道中跳过指定数量的⽂档,并返回余下的⽂档。
$unwind:将⽂档中的某⼀个数组类型字段拆分成多条,每条包含数组中的⼀个值。$group:将集合中的⽂档分组,可⽤于统计结果。$sort:将输⼊⽂档排序后输出。
$geoNear:输出接近某⼀地理位置的有序⽂档。
3. 管道操作符实例
1. $project实例
db.article.aggregate (    { $project  : {        title : 1 ,        author : 1 ,    }} );
这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
db.article.aggregate (    { $project  : {        _id : 0 ,        title : 1 ,        author : 1    }});
2. $match实例
db.articles.aggregate ( [
{ $match  : { score : { $gt  : 70, $lte  : 90 } } },                        { $group : { _id: null, count: { $sum : 1 } } }                      ] );
group管道操作符进⾏处理。
3. $skip实例
db.article.aggregate (    { $skip  : 5 });
经过$skip管道操作符处理后,前五个⽂档被"过滤"掉。4. 时间聚合
按⽇、按⽉、按年、按周、按⼩时、按分钟聚合操作如下:
last :"match ⽤于获取分数⼤于70⼩于或等于90记录,然后将符合条件的记录送到下⼀阶段
[
{$match:{m_id:10001,mark_time:{$gt:new Date(2017,8,0)}}},
{$group:{
_id: {$dayOfMonth:'$mark_time'},
pv: {$sum: 1}
}
},
{$sort:{"_id": 1}}
])
时间关键字如下:error parse new
$dayOfYear: 返回该⽇期是这⼀年的第⼏天(全年 366 天)。
$dayOfMonth: 返回该⽇期是这⼀个⽉的第⼏天(1到31)。
$dayOfWeek: 返回的是这个周的星期⼏(1:星期⽇,7:星期六)。
$year: 返回该⽇期的年份部分。
$month: 返回该⽇期的⽉份部分( 1 到 12)。
$week: 返回该⽇期是所在年的第⼏个星期( 0 到 53)。
$hour: 返回该⽇期的⼩时部分。
$minute: 返回该⽇期的分钟部分。
$second: 返回该⽇期的秒部分(以0到59之间的数字形式返回⽇期的第⼆部分,但可以是60来计算闰秒)。
$millisecond:返回该⽇期的毫秒部分( 0 到 999)。
$dateToString: { $dateToString: { format: , date: } }。
4. 条件操作符
(>) ⼤于 - $gt
(<) ⼩于 - $lt
(>=) ⼤于等于 - $gte
(<= ) ⼩于等于 - $lte
$type
$type使⽤
mongo数据类型
类型数字备注
Double1
String2
Object3
Array4
Binary data5
Undefined6已废弃。
Object id7
Boolean8
Date9
Null10
类型数字备注
Regular Expression11
JavaScript13
Symbol14
JavaScript (with scope)15
32-bit integer16
Timestamp17
64-bit integer18
Min key255Query with -1.
Max key127
类型为string的数据
5. 条件语句
AND(,)
OR($or)
AND 和 OR联合

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。