近期在学习MongoDB时遇到了find()查询
其中在模糊查询和统计中我接触到新的东西
db.test.find({"name" : re.compile("d")})
与
db.test.find({"name" : {"$regex" : "d"}})
有相同的功能
db.test.count_documents({"num" : {"$gt" : 1}}) # 查询 num 大于 1 的数据
那么 $regex 和 $gt 中的 $ 是什么? 还有哪些相似的语句呢?
Name | Description |
---|---|
$eq | 匹配等于指定值的值 |
$gt | 匹配大于指定值的值 |
$gte | 匹配大于或等于指定值的值 |
$lt | 匹配小于指定值的值 |
$lte | 匹配小于或等于指定值的值 |
$ne | 匹配所有不等于指定值的值 |
$in | 匹配数组中指定的任何值 |
$nin | 不匹配数组中指定的任何值 |
db.test.find({"age": {"$eq":19}})
db.test.find({"age": {"$gt":19}})
db.test.find({"age": {"$gte":19}})
db.test.find({"age": {"$lt":19}})
db.test.find({"age": {"$lte":19}})
db.test.find({"age": {"$ne":19}})
db.test.find( {"name": {"$in": ["张三", "李四", "王五" ]}})
db.test.find( {"name": {"$nin": ["张三", "李四", "王五" ]}})
Name | Description |
---|---|
$and | 将查询子句与逻辑子句联接,并返回与这两个子句的条件匹配的所有文档 |
$not | 反转查询表达式的效果并返回与查询表达式不匹配的文档 |
$nor | 使用逻辑NOR联接查询子句将返回与这两个子句都不匹配的所有文档 |
$or | 将查询子句与逻辑或联接,返回与任一子句的条件匹配的所有文档 |
在进行逻辑运算的时候 “and” 操作是最容易,直接使用 “,”分割即可
db.test.find( {"$and": [ {"age": {"$gte" : 19} }, {"age": {"$lte": 25 }}]})
# 等价于
db.test.find({"age": {"$gte": 19, "$lte": 25 }})
$not 操作符不能独立使用,必须跟其他操作一起使用(除 $regex)
db.test.find( { "age": { "$not": { "$gt": 19 } } } )
# 等同于
db.test.find( { "age": { "$lte": 19 } } )
db.test.find( {"$or": [ {"age": {"$lt" : 19} }, {"age": {"$gt": 25 } } ] })
db.test.find( {"$nor": [ {"age": {"$lt" : 19} }, {"age": {"$gt": 25 } } ] })
Name | Description |
---|---|
$exists | 匹配具有指定字段的文档 |
$type | 如果字段属于指定类型,则选择文档 |
如果 $exists 的值为true,选择存在该字段的文档;若值为 false 则选择不包含该字段的文档。
db.test.find( { "age": { "$exists" : false } })
db.test.find( { "age": { "$exists" : true, $nin: [ 19, 25 ] } }
操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果
db.test.find({"name" : {$type : 2}})
# 等价于
db.test.find({"name" : {$type : 'string'}})
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
Name | Description |
---|---|
$expr | 允许在查询语言中使用聚合表达式 |
$jsonSchema | 根据给定的JSON模式验证文档 |
$mod | 对字段的值执行模运算,并选择具有指定结果的文档 |
$regex | 选择值与指定正则表达式匹配的文档 |
$text | 执行文本搜索 |
$where | 匹配满足JavaScript表达式的文档 |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 }
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 }
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 }
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 }
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "gpa" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
gender: {
bsonType: "string",
description: "must be a string and is not required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
exclusiveMaximum: false,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double and is required"
}
}
}
}
})
https://blog.csdn.net/newbie_907486852/article/details/82528746
db.inventory.find( { amount: { $mod: [ 4, 0 ] } } )
# 例如 amount 值等于 16 的文档
{"name":"t1", "amount":16, "tags":[ "school", "book", "bag", "headphone", "appliances" ]}
比如刚开始的例子
db.test.find({"name" : re.compile("d")})
对于 options 主要是设置正则的信息查询的标记:
如果是直接使用(javaScript)那么只能够使用 “i” 与 “m”,而 “x” 和 “s” 必须使用 “$regex”
查询name键值以“4”结尾的文档
db.inventory.find( { name: /.4/i } );
# 等价于
db.inventory.find( { name: { $regex: '.4', $options: 'i' } } );
db.test.find( { $text: { $search: "modeng" } } )
他可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数。
新建fruit集合并插入如下文档:
//插入两条数据
db.fruit.insert({"apple":1, "banana": 4, "peach" : 4})
db.fruit.insert({"apple":3, "banana": 3, "peach" : 4})
比较文档中的两个键的值是否相等.例如查找出banana等于peach键值的文档(4种方法):
//JavaScrip字符串形式
db.fruit.find( { $where: "this.banana == this.peach" } )
db.fruit.find( { $where: "obj.banana == obj.peach" } )
//JavaScript函数形式
db.fruit.find( { $where: function() { return (this.banana == this.peach) } } )
db.fruit.find( { $where: function() { return obj.banana == obj.peach; } } )
查出文档中存在的两个键的值相同的文档,JavaScript函数会遍历集合中的文档:
>db.fruit.find({$where: function () {
for (var current in this) {
for (var other in this) {
if (current != other && this[current] == this[other]) {
return true;
}
}
}
return false;
}});
我们尽量避免使用"Where"査询,因为它们在速度上要比常规査询慢很多。每个文档都要从BSON转换成JavaScript对象,然后通过"where"的表达式来运行;同样还不能利用索引。
Name | Description |
---|---|
$geoIntersects | 选择与GeoJSON几何体相交的几何体。2dsphere索引支持$geoIntersects |
$geoWithin | 选择边界GeoJSON几何图形中的几何图形。2dsphere和2d索引支持$geoinfin |
$near | 返回接近点的地理空间对象。需要地理空间索引。2dsphere和2d索引支持$near |
$nearSphere | 返回接近球点上的地理空间物体。需要地理空间索引。2dsphere和2d索引支持$nearSphere |
有点高深,等有需求时补充
Name | Description |
---|---|
$all | 匹配包含查询中指定的所有元素的数组 |
$elemMatch | 如果数组字段中的元素与所有指定的$elemMatch条件匹配,则选择文档 |
$size | 如果数组字段是指定大小,则选择文档 |
db.inventory.find( { tags: { $all: [ "appliance", "school", "book" ] } } )
db.scores.find({ tags: { $elemMatch: { $gte: 80, $lt: 85 } } })
db.collection.find( { tags: { $size: 2 } } );
Name | Description |
---|---|
$bitsAllClear | 匹配一组位位置的值都为0的数值或二进制值 |
$bitsAllSet | 匹配一组位位置的值都为1的数值或二进制值 |
$bitsAnyClear | 匹配数值或二进制值,其中来自一组位位置的任何位的值为0 |
$bitsAnySet | 匹配数值或二进制值,其中来自一组位位置的任何位的值为1 |
Name | Description |
---|---|
$comment | 向查询语句添加注释 |
Name | Description |
---|---|
$ | 在与查询条件匹配的数组中投影第一个元素 |
$elemMatch | 投影数组中与指定的$elemMatch条件匹配的第一个元素。 |
$meta | 投影在$text操作期间分配的文档分数 |
$slice | 限制从数组投影的元素数。支持跳过和限制切片 |
https://docs.mongodb.com/manual/reference/operator/query/
https://blog.csdn.net/newbie_907486852/article/details/82528746
https://blog.csdn.net/qq_18948359/article/details/88251592