一、操作符

"$lt"       :"<"
"$lte" :"<="
"$gt" :">"
"$gte" :">="
"$ne" :"!="
"$in" :查询匹配指定条件值的文档;
"$nin" :查询不匹配指定条件值的文档;
"$or" :或查询

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:


操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value>} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

 
MongoDB 查询文档

二、链式操作

append方法:尤其适用于日期等区间查询条件。

三、一些基本操作

db.createCollection('user');  --创建表
db.getCollection('user').remove({'_id':1});  --删除记录
db.getCollection('user').ensureIndex({"email":1});  --新建索引
db.getCollection('user').insert({  --插入记录        
"_id" : 1,
"email" : "xxx@mtime.com",
"name" : "哈哈",
"salt" : "5927eb03f6ee9428bc55aa0d",
"pwd" : "121212",
"admin" : true,
"roles" : [

],
"subjects" : [
1,
2,
3,
4
],
"status" : 1,
"muser" : 1,
"mtime" : ISODate("2017-07-10T01:21:19.359Z")
}
);

--修改记录

db.getCollection('language').update({},{$set:{muser:5,mtime:new Date()}},false,true);
db.getCollection('language').update({},{$unset:{'modifyTime':''}},false, true); --删除列
db.getCollection('language_pack').update({},{$set:{modifyUser:5,modifyTime:new Date()}},false,true);

db.getCollection('activity').update({_id:25}, {$set: {status:2}}, {multi: true});

创建复合唯一索引

db.video.createIndex({source_type:1,source:1,video_id:1,key_word:1},{name:'idx_source_type_source_video_id_key_word',unique:true});

--分组聚合

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。
db.getCollection('video').aggregate([
{ $group: { _id : '$source', count: { $sum : 1 } } },
{ $match: { count: { $gt : 1} } }
])

db.getCollection('video').aggregate([
  {$project:{source : 1, source_type : 1,video_id:1,enter_time:1}},
  {$match: {source:2,enter_time:{"$gte":ISODate('2020-03-22 07:42:58.675') , "$lt":ISODate('2020-05-22 19:00:00.141') },can_capture:{$ne:1}}},
  {$group: { _id: {source : '$source', source_type : '$source_type',video_id:'$video_id'}, count: { $sum: 1 } }},
  {$sort:{video_id:1}},
  {$skip: 0 },
  {$limit: 10 }
]);

注意:$peoject中,1-包含,0-不包含,_id 字段默认为包含

--查询与删除重复数据

db.video.aggregate([{
$group: {
_id: {
source: '$source',
source_type: '$source_type',
video_id: '$video_id',
key_word: '$key_word'
},
count: {
$sum: 1
},
dups: {
$addToSet: '$_id'
}
}
}, {
$match: {
count: {
$gt: 1
}
}
}]).forEach(function(doc) {
doc.dups.shift();
db.video.remove({
_id: {
$in: doc.dups
}
});
})

按日期分组统计

{
"collection": "video",
"aggregate": [
{
"$match": {
"enter_time": {
"$gte": {
"$humanTime": "{{ StartDate }}"
},
"$lt": {
"$humanTime": "{{ EndDate }}"
}
}
}
},
{
"$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$enter_time",
"timezone": "+0800"
}
},
"count": {
"$sum": 1
}
}
}
]
}

日期条件查询

db.video_comment_push_log.find({"source_type":4,"source":4}).sort({"_id":-1}).limit(2);

db.video_comment.find({"source_type":4,"source":4,"enter_time":{"$gte":ISODate('2020-04-22 07:42:58.675') , "$lt":ISODate('2020-04-22 19:00:00.141') }}).count();

db.video_comment.find({"source_type":4,"source":4}).sort({"enter_time":-1}).limit(100);

db.video_comment.count({"source_type":4,"source":4});

back

db.video_comment_push_log.find({"source_type":7,"source":2}).sort({"_id":-1}).limit(20);

db.video_comment.find({"source_type":4,"source":4,"enter_time":{"$gte":ISODate('2020-04-22 03:00:00.114') , "$lt":ISODate('2020-04-22 05:00:00.111') }}).count();

db.video_comment.find({"source_type":4,"source":4}).sort({"enter_time":-1}).limit(100);

db.video_comment.count({"source_type":4,"source":4});

db.video_push_log.find({"source_type":71,"source":2}).sort({"_id":-1}).limit(20);

db.video.count({"source_type":4,"source":4,"enter_time":{"$gte":ISODate('2020-04-22 17:00:00.136') , "$lt":ISODate('2020-04-23 06:00:00.098') }});

db.teleplay_episode.count({"source_type":7,"source":2,"enter_time":{"$gte":ISODate('2020-04-21 00:00:00.208') , "$lt":ISODate('2020-04-21 16:00:00.249') }});

db.teleplay_comment.count({"source_type":7,"source":2,"enter_time":{"$gte":ISODate('1970-01-01 00:00:00.001') , "$lt":ISODate('2020-04-22 06:00:00.156') }});

redash查询mongo

{
"collection":"series_top_list",
"query":{"code":"tengxunshipin"},
"$sort": [{"name": "ranking","direction": 1}]
}
{
"collection":"risk_score",
"aggregate":[
{"$group":{"_id":"$udid", "count":{"$sum":1}}},
{"$match":{"count":{"$gt":1}}},
{"$sort": [{"name": "count","direction": -1}]}
]
}

参考资料:

MongoDB教程

mongoDB document

MongoDB 入门

mongodb_查询操作使用_条件查询、where子句等

MongoDB学习笔记(查询)

MongoDB 查询文档

MongoDB 排序

MongoDB 聚合

MongoDB学习笔记-数据格式及数据类型

mongodb 格式化时间

Mongodb聚合框架Aggregate - 时间戳转时间聚合分组统计实现

mongoDB——java操作mongodb文档

mongodb-java-driver基本用法

MongoDB Java Driver

Mongo中append方法使用

学习MongoDB-应用举例(利用java操作MongoDB)

NoSQL 之 Morphia 操作 MongoDB

MongoDB 创建索引的语法

MongoDB查询和去除重复数据

MongoDB查询大于某个时间,小于某个时间,在某一段时间范围

mongoTemplate.aggregate()聚合查询

mongoTemplate.aggregate() 聚合查询,关联查询

mongoTemplate 聚合分组统计,aggregate分页

MongoDB批量更新和批量插入的方式

mongoDB-Criteria

mongo使用小记0之Query和Criteria查询语句

关于mongoDB使用java实现高级查询query参数的组装

MongoTemplate复合条件查询

MongoDB学习记录的更多相关文章

  1. mongoDB学习记录---PHP扩展的find返回值

    最近的一个项目中用到了MongoDB,主要是使用MongoDB的PHP扩展.MongoDB的扩展中用于一个用于查询的方法是find().下面针对在理解MongoDB扩展的find()方法中做的实验做个 ...

  2. MongoDB 学习记录(二)yum安装

    前言:接着上篇继续学习MongoDB,这次学习的是在Linux下安装MongoDB 环境:centos7.3 安装版本:MongoDB4.0 官网安装教程地址 https://docs.mongodb ...

  3. MongoDB学习记录(四) - MongoDB的"增查改删"操作之"改"

    更新文档主要有以下几种方法: db.collection.updateOne(filter, update, options) db.collection.updateMany(filter, upd ...

  4. MongoDB学习记录(二) - MongoDB的"增查改删"操作之"增"

    如果做插入文档操作的集合不存在,那么集合将被创建 db.collection.insertOne() insertOne为collection插入一条文档,如果文档的_id字段未指定,MongoDB会 ...

  5. MongoDB 学习记录(一)

    前言:之前一直只是简单了解MongoDB,而且是随便看看的那种,今天决定好好的整理一下,以便自己能  温故而知新 1.MongoDB是什么 MongoDB 是一个高性能,开源,无模式的文档型数据库,开 ...

  6. MongoDB学习记录(一) - 安装、启动与建立数据库

    简要说明一个基本概念:MongoDB中的三要素:数据库(database).集合(collection)和文档(document). 文档:类似于JSON对象,由字段(field)和值(value)组 ...

  7. MongoDB学习记录(三) - MongoDB的"增查改删"操作之"查"

    查找使用的方法: db.collection.find() 查找所有文档 db.collection.find({})或者db.collection.find({}) 指定键值对 db.collect ...

  8. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  9. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

随机推荐

  1. iOS开发——高级篇——流水布局UICollectionViewFlowLayout的基本使用

    之前看到过的一篇文章 对collectionView的使用总结的非常好:“iOS6新特征:UICollectionView介绍” 流水布局在现在的应用中很常见了,简单的研究了下,实现下面的功能 那我这 ...

  2. 【Python基础学习二】定义变量、判断、循环、函数基本语法

    先来一个愉快的Hello World吧,就是这么简单,不需要写标点符号,但是需要严格按照缩进关系,Python变量的作用域是靠tab来控制的. print("Hello World" ...

  3. AngularJS 配置和运行phonecat错误

    安装node.js 就按照入门上的步骤来就行了 第一步:下载安装node.js,并将程序路径添加到环境变量中PATH中 第二步:下载git版本控制软件 第三步:在git目录下点击git-bash.ex ...

  4. jython安装与配置

    安装jython 0. 计算机中要安装jdk 1. 在官网www.jython.org上找到下载页面,然后下载jython-installe 2. 在cmd.exe中运行java -jar jytho ...

  5. secureCRT会话导入到xshell中的方法

    官方给出了一个工具,sessionimporter.exe 不过软件有点老了,导入的会话路径和xshell默认的会话路径不一致,导致导入后,xshell没有导入的会话信息 sessionimporte ...

  6. C# 类动态添加属性、方法(Z)

      问题: 需要动态为WPF中的DataGrid添加列,并动态绑定相应数据.(此处仅实现动态属性的添加和使用,关于动态方法的添加和使用详见推荐阅读) 实现关键点: 目标类继承DynamicObject ...

  7. jQuery的.bind()、.live()和.delegate()的区别

    参考:http://kb.cnblogs.com/page/94469/ 摘要:jQuery的.bind()..live()和.delegate()之间的区别并非总是那么明显的,然而,如果我们对所有的 ...

  8. jquery this 和 event.target 区别

    1.this和event.target的区别: js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的目标DOM元素: 2.this和event.t ...

  9. 【康拓展开】及其在求全排列第k个数中的应用

    题目:给出n个互不相同的字符, 并给定它们的相对大小顺序,这样n个字符的所有排列也会有一个顺序. 现在任给一个排列,求出在它后面的第i个排列.这是一个典型的康拓展开应用,首先我们先阐述一下什么是康拓展 ...

  10. HDU 2545 树上战争 (并查集+YY)

    题意:给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,lxh总是先移动 ,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜 比较有意思的 ...