MongoDB基础操作之CRUD:Read

本文介绍了MongoDB的基础操作,重点讲解了如何进行读取文档,包括匹配查询、使用各种查询操作符,以及如何利用游标进行数据迭代。还详细讨论了文档投影,即如何选择性地返回文档的部分字段,包括内嵌文档和数组的投影。并提供了在mongo shell中读取文档的实战示例。

读取文档

db.collection.find()

  • 匹配查询
  • 查询操作符
  • 游标
    • 查询操作返回:结果游标
    • 游标的迭代与操作
  • 投射
    • 只返回部分字段
    • 内嵌文档的投射
    • 数组的投射

实践

使用mongo shell读取文档

全文档查询:db.collection.find()

## <projection>文档定义了对读取结果进行的投射
db.<collection>.find(<query>, <projection>)

读取全部文档:既不筛选,也不投射

db.<collection>.find()
db.<collection>.find().pretty()

## 例子:
db.accounts.find()

## 更清楚的打印文档
db.accounts.find().pretty()

筛选文档:匹配查询

## 读取alice的银行账户文档
db.accounts.find({name:"alice"})

## 读取银行账户类型为储蓄账户的文档
## 注意:
### 当查询条件中涉及子级内容的需要使用""包起来,如"_id.type"
### 一级条件可以不使用"",如name
### 这里建议都使用""包起来
db.accounts.find({"_id.type":"savings",name:"alice"})

筛选文档:比较操作符
{ <field>: { $<operator>: <value> } }

operator含义
eq匹配字段值相等的文档
ne匹配字段值不等的文档
gt匹配字段值大于查询值的文档
gte匹配字段值大于或等于查询值的文档
lt匹配字段值小于查询值的文档
lte匹配字段值小于或等于查询值的文档
in匹配字段值与任何一查询值相等的文档
nin匹配字段值与任何查询值都不等的文档
## 使用$eq查询和匹配查询效果相同
db.accounts.find({"name":{$eq:"alice"}})

## 使用$ne查询
### 注意:$ne也会筛选出并不包含查询字段的文档
db.accounts.find({"name":"alice", "balance":{$ne:"200"}})

## 当使用gt,lt,gte,lte进行字符串的比较的时候,会按照的字母的顺序进行比较

## $in $nin
### 格式:{ <field>: { $in/$nin: [<value1>,<value2>...]}}
### 注意:$nin和$ne一样也会筛选出并不包含查询字段的文档
db.accounts.find({"name":{$in:["alice","joke"]}})
db.accounts.find({"name":{$nin:["alice","joke"]}})

筛选文档:逻辑操作符

operator含义
not匹配筛选条件不成立的文档
and匹配多个筛选条件全部成立的文档
or匹配至少一个筛选条件成立的文档
nor匹配多个筛选条件全部不成立的文档
## $not
### 格式:{ field: { $not: { <operator-expression} } }
### 注意:$not也会筛选出并不包含查询字段的文档
db.accounts.find({balance: {$not: {$lt:500}}})

## $not
### 格式:{$and:[{<expression1},{expression2},...]}
### $and操作符可以被省略
db.accounts.find({$and:[{"balance":{$gt:100}},{"name":{$gt:"fred"}}]})
db.accounts.find({balance:{$gt:100},name:{$gt:"fred"}})
db.accounts.find({balance:{$gt:50,$lt:100}})

筛选文档:字段操作符

operator含义
exists匹配包含查询字段的文档
type匹配字段类型符合查询值的文档
## $exists
### 格式:{<field>:{$exists:<boolean>}}
### 注意:当使用$exists操作符时,查询字段必须存在才会被筛选出来
db.accounts.find({"balance":{$exists:true}})

## $type
### 格式1:{field:{$type:<BSON type>}}
### 格式2:{field:{$type:[<BSON type1>,<BSON type2>,...]}}
db.accounts.find({"_id.type":{$type:"string"}})
db.accounts.find({"_id":{$type:["objectId","object"]}})

筛选文档:数组操作符

operator含义
all匹配数组字段中包含所有查询值的文档
elemMatch匹配数组字段中至少存在一个值满足筛选条件的文档
## $all
### 格式:{<field>:{$all:[<value1>,<value2>,...]}}
db.accounts.find({contact:{$all:["Beijing","China"]}})

## $elemMatch
### 格式:{<field>:{$elemMatch:{<query1>,<query2>,...}}}
db.accounts.find({"contact":{$elemMatch:{$gt:"100000",$lt:"200000"}})

筛选文档:运算操作符

operator含义
regex匹配满足正则表达式的文档
## $regex
### 格式1:{<field>:{:/pattern/,:'<options>'}}
### 格式2:{<field>:{:/pattern/<options>}}
### 兼容PCRE v8.41正则表达式库
#### 在和$in操作符一起使用时,只能使用/pattern/<options>
db.accounts.find({"name":{$in:[/^c/, /^j/]})
db.accounts.find({"name":{$regex:/LIE/,$options:'i'}})

文档游标

db.<collection>.find()返回一个文档集合游标在不迭代游标的情况下,只列出前20个文档。我们也可以使用游标下标直接访问文档集合中的某一个文档

var myCursor = db.accounts.find();
## 遍历游标
### 遍历完游标中所有的文档之后,或者在10分钟后,游标便会自动关闭
myCursor
### 可以使用noCursorTimeout()函数来保持游标一直有效,当然如果遍历完游标,游标也会关闭。在不遍历游标的情况下,需要手动关闭游标
var myCursor = db.accounts.find().noCursorTimeout();
myCursor.close()

游标函数

  • cursor.hasNext()
  • cursor.next()
  • cursor.forEach()
  • cursor.limit()
  • cursor.skip()
  • cursor.count()
  • cursor.sort()
## <cursor>.hasNext()
## <cursor>.next()
var myCursor = db.accounts.find({"balance":{$gt:20}});
while(myCursor.hasNext()) {
	printjson(myCursor.next());
};

## <cursor>.forEach(<function>)
var myCursor = db.accounts.find({"balance":{$gt:20}};
myCursor.forEach(printjson)

## <cursor>.limit(<number>)
### 限制多少条文档
### 注意:<cursor>.limit(0)是返回所有符合条件的文档
db.accounts.find({"balance":{$gt:20}}).limit(1)

## <cursor>.skip(<offset>)
### 跳过多少条文档
db.accounts.find({"balance":{$gt:20}}).skip(1)

## <cursor>.count(<applySkipLimit>)
### 默认情况下,<applySkipLimit>为false,即<cursor>.count()不会考虑<cursor>.limit()和<cursor>.skip()的效果
db.accounts.find({"balance":"200"}).skip(1).limit(1).count(true)
### 在不提供筛选条件时,<cursor>.count()会从集合的元数据Metadata中取得结果
### 当数据库分布式结构较为复杂时,元数据中的文档数量可能不准确
db.accounts.find().count()

## <cursor>.sort(<document>)
### 这里的<document>定义了排序的要求
### 格式:{field:ordering}
### 1表示由小及大的正向排序,-1表示逆向排序
db.accounts.find().sort({"balance":-1,"name":1})

需要注意的是,<cursor>.skip()<cursor>.limit()之前执行,<cursor>.sort()在在<cursor>.skip()<cursor>.limit()之前执行

文档投影

db.<collection>.find(<query>,<projection>)

不使用投影时,db.<collection>.find()返回符合筛选条件的完整文档,而使用投影可以有选择性的返回文档中的部分字段。

### 格式:{field: inclusion}
#### 1表示返回字段,0表示不返回字段
### 注意:除了文档主键之外,我们不可以在投影文档中混合使用包含和不包含这两种操作,要么在投影文档中列出所有应该包含的字段,要么列出所有不应该包含的字段
db.accounts.fin({},{"name":1})
db.accounts.find({"name":{$lt:"fred"}},{"name":1,"_id":0})

## 在数组字段上使用投影
### $slice操作符可以返回数组字段中的部分元素
#### 返回数组中的第一个元素
db.accounts.find({},{"_id":0,"name":1,"contact":{$slice:1}})
#### 返回数组中的倒数第一个元素
db.accounts.find({},{"_id":0,"name":1,"contact":{$slice:-1}})
#### 此时,会先在数组中执行skip(1)操作,然后执行limit(2)操作
db.accounts.find({},{"_id":0,"name":1,"contact":{$slice:[1,2]}})
### $elemMatch和$操作符可以返回数组字段中满足筛选条件的第一个元素
db.accounts.find({},{"_id":0,"name":1,"contact":{$elemMatch:{$gt:"Alabama"}})
### 当查询条件和后面的筛选条件一样时,可以使用$
db.accounts.find({"contact":{$gt:"Alabama"}},{"_id":0,"name":1,"contact.$":1})
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)内容概要:本文围绕基于粒子群算法(PSO)优化Kmeans聚类的居民用电行为分析展开研究,提出了一种结合智能优化算法与传统聚类方法的技术路径。通过使用粒子群算法优化Kmeans聚类的初始聚类中心,有效克服了传统Kmeans算法易陷入局部最优、对初始值敏感的问题,提升了聚类的稳定性和准确性。研究利用Matlab实现了该算法,并应用于居民用电数据的行为模式识别与分类,有助于精细化电力需求管理、用户画像构建及个性化用电服务设计。文档还提及相关应用场景如负荷预测、电力系统优化等,并提供了配套代码资源。; 适合人群:具备一定Matlab编程基础,从事电力系统、智能优化算法、数据分析等相关领域的研究人员或工程技术人员,尤其适合研究生及科研人员。; 使用场景及目标:①用于居民用电行为的高效聚类分析,挖掘典型用电模式;②提升Kmeans聚类算法的性能,避免局部最优问题;③为电力公司开展需求响应、负荷预测和用户分群管理提供技术支持;④作为智能优化算法与机器学习结合应用的教学与科研案例。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解PSO优化Kmeans的核心机制,关注参数设置对聚类效果的影响,并尝试将其应用于其他相似的数据聚类问题中,以加深理解和拓展应用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值