golang数据库 MongoDB 查询(3)

Golang 2023/04/23 Golang, MongoDB

一 find

1.1 find简介

语法:

语法:
db.集合名.find()      // 查询条件默认为 {}  返回该集合所有文档,当然还有第二个{}参数,用来指定返回哪些字段

注意:find查询始终会返回主键,查询的条件参数内,键的值必须是常量

示例:
db.user.find({age:18,sex:1})
db.user.find(age:18,sex:1},{name:1})  //查询年龄为18,性别为1的人的年龄,如果name字段的值为0,表示返回结果不显示该字段

1.2 条件查找

在mysql中,常用的条件是<,>,>=等等,在mongo中采用如下方式:

语法:
db.collection.find({field: {$gt:value}})    //大于:field > vlue
db.collection.find({field: {$lt:value}})    //小于:field < vlue
db.collection.find({field: {$gte:value}})    //大于等于:field >= vlue
db.collection.find({field: {$lte:value}})    //大于等于:field <= vlue
db.collection.find({field: {$ne:value}})    //不等于

示例:
db.user.find(age:{$gt:18, $lt:50})

$all 查找满足条件的所有数据:

db.user.find(hob: {$all:["网球","WOW"]})            //用户的兴趣键hob,值是个数组,查找兴趣包含 网球 WOW 的人   注意这里与数组的顺序无关

注意:如果是对一个元素操作,下列两种写法结果一致
db.user.find(hob: {$all:["网球"]})
db.user.find(hob: "网球")

$exists 判断字段是否存在。

db.user.find({name:{$exists:true}})                 //查询name字段是否在user集合中, false表示查询不存在该字段的文档

null值处理

db.user.find({age:null})                            //查询age值为null的文档,但是会查询到没有age字段的文档
db.user.find({age:{$in:[null], $exists:true}})      //查询既age字段,age字段值又为null的文档

$mod 取模运算

db.user.find({age: { $mod: [10, 0]}})       //查询age字段值,取模10等于0的文档

$in 包含
$nin 不包含,用法同 $in

与sql中的in用法一致:
db.collection.find(field: {$in: [n1,n2,n3]})

$size 查询指定长度的数组

db.user.find(hob: {$size: 4})       //查询有4个兴趣的人

正则支持:mongo查询支持正则筛选

db.user.find(name: /s/)       //查询名称中含有s的人,在sql中使用的是 %s%

其他条件:
    s/:     以s开头

1.3 where查找与JS查询

条件查询的多种方式:

查询年龄大约18岁的人

方式一
db.user.find({age: {$gt: 18}})

方式二
db.user.find({$where: "this.age>18"})

方式三
db.user.find({"this.age>18"})

方式四
f = function(){return this.age>18}
db.user.find(f)

注意:$where可以传入各种JS表达式,但是这种查询方式需要将BSON文档转换为JS对象,速度相对较慢,不推荐使用

1.4 count()

count()获取查询结果的数目:

db.collection.find().count()

注意:返回一些条件查询后的数目,需要传入参数true或者非0
db.user.find().skip(2).count(1)

1.5 limit() 与 skip()

limit()用于限制返回记录数,skip()用于限制返回记录的起点

db.user.find().limit(3)         //只返回前三条数据
db.user.find().skip(2)          //从第二条记录开始返回

1.6 sort()

sort()用于排序:

db.user.find().sort({age:1})    //按年龄升序排列, -1表示降序排列,当然也可以指定多个键条件

1.7 分页查询

limit,skip,sort通常用于分页查询。

第一页:db.collection.find().limit(N)
第二页:db.collection.find().skip((2-1)*N).limit(N)
第三页:db.collection.find().skip((3-1)*N).limit(N)
...
第P页:db.collection.find().skip((P-1)*N).limit(N)

1.8 distinct

distinct用于排除选项。

语法:
db.runCommand({distinct: collection, key: keyname})

示例:
db.runCommand({distinct: "user", key: "name"})

1.9 游标

游标在mongoshell中的使用:

var cursor = db.user.find()
while(cursor.hasNext()){
    printjson(cursor.next())
}

当然游标也有一个迭代函数,允许我们自定义回调函数来逐个处理每个单元:

cursor.forEach(回调函数)

1.10 内嵌文档

一般情况下,文档内部内嵌的文档是直接以{}形式出现的,但是在更新时,很容易出现多处需要更新的情况,这时反范式的。而如果通过id来手动关联另一个集合,修改方便了,但是读取又变成了2次。

Mongo推出了DBRef来解决这个问题,类似mysql中的外键。

# 语法
{$ref: 集合名, $id: 引用id, $db: 可选参数-数据库名}

# 示例
部门集合department中的一个文档:
{"id": 1, name: "技术部", index: 10}
员工集合中的一个文档张三,属于上述部门
{
    "name":"张三",
    "age": 22,
    "department": {"$id": 1, $ref": "department"}
}

此时查询员工集合,就可以直接查询到该员工所属部门的文档内容。


本文地址:https://www.stayed.cn/item/384

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。