首页 > 其他分享 >.only('field_name') 的作用

.only('field_name') 的作用

时间:2024-11-18 11:30:36浏览次数:1  
标签:name doc field only ip id 加载

在使用 mongoengine 的 QuerySet 时,.only('field_name') 是一种优化查询的方法,用于指定只查询某些字段的数据。以下是其工作原理及返回的内容:

.only('field_name') 的作用

它限制 MongoDB 查询返回的字段,仅获取指定的字段内容。用于提高查询性能,减少不必要的数据加载。

示例

`results = MyDocument.objects.only('ip')`

具体效果:

返回的是一个 QuerySet,其中的每个文档只包含 ip 字段(以及默认的 _id 字段)。
其他字段的值不会被加载到内存中,访问它们时会抛出 mongoengine.errors.ValidationError。

返回内容

返回的对象类型:QuerySet,包含符合条件的文档。

文档的字段:

只包含 ip 和默认的 _id 字段。

访问字段:

for doc in results:
    print(doc.ip)  # 可以正常访问 `ip` 字段
    print(doc.id)  # `_id` 字段总是存在
    print(doc.other_field)  # 访问未加载的字段会报错

定义文档模型

from mongoengine import Document, StringField, IntField

class MyDocument(Document):
    ip = StringField()
    name = StringField()
    age = IntField()

查询数据

假设有如下数据:

{ "_id": ObjectId("..."), "ip": "192.168.0.1", "name": "Alice", "age": 30 }

只查询 ip 字段

results = MyDocument.objects.only('ip')

遍历查询结果

for doc in results:
print(doc.ip) # 输出: 192.168.0.1
print(doc.id) # 输出: 文档的 _id
# print(doc.name) # 报错: ValidationError,因为 name 字段未被加载

注意事项

无法访问未加载的字段:
通过 .only('field') 限制返回字段后,未指定的字段将不可访问。
如果尝试访问未加载的字段,会抛出 ValidationError。

_id 字段默认返回:

MongoDB 的 _id 字段是默认加载的,即使未显式指定,它也会包含在结果中。

组合使用:

可以指定多个字段:

results = MyDocument.objects.only('ip', 'name')
性能优化:

.only() 对于大型文档的性能优化尤为明显,因为它避免了加载所有字段。

适用场景
减少网络传输量:在查询大型文档时,只获取必要的字段。
优化性能:避免加载不需要的字段,减少内存占用。
特定字段操作:当你只需要某几个字段用于展示或计算时。
### 例如,在日志系统中,你可能只需要查询 IP 地址来统计访问情况:

ip_list = [doc.ip for doc in MyDocument.objects.only('ip')]

标签:name,doc,field,only,ip,id,加载
From: https://www.cnblogs.com/pmna/p/18552223

相关文章

  • Python 中 if __name__ == ‘__main__‘ 的解释
    1.基本概念   在Python中,`if__name__=="__main__"`是一种常见的代码结构。`__name__`是一个内置变量,它的值取决于模块是如何被使用的。   当一个Python脚本被直接运行时,`__name__`的值被设置为`"__main__"`。而当一个模块被另一个模块导入时,`__name__`的值就是该......
  • 调用Exe程序并且出现界面 CreateProc(ProcessName:String)
    FunctionGetProcessHandleAsName(Name:String):THandle;VarHd,Hs:THandle;dExit:Cardinal;Tmp,Tmp1:String;Lp:TProcessEntry32;beginResult:=0;Lp.dwSize:=sizeof(TProcessEntry32);Hd:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);ifProcess32First(Hd,Lp)thenRepea......
  • Langchain and Azure cognitive search - ImportError - cannot import name ‘Vector
    题意:LangchainandAzurecognitivesearch-ImportError-cannotimportname'Vector'from'azure.search.documents.models'“Langchain和Azure认知搜索-导入错误:无法从'azure.search.documents.models'导入名称'Vector'”问题背景:Iam......
  • avalonia在linux下运行出现Default font family name can't be null or empty问题的解
    avalonia在linux下运行出现Defaultfontfamilynamecan'tbenullorempty的错误,是因为Avalonia无法确定或找不到默认的字体名,可以先在控制台打命令确定本机安装字体fc-list然后在avalonia项目的program.cs中增加此代码:publicstaticAppBuilderBuildAvalonia......
  • [USACO06NOV] Corn Fields G 题解
    题目链接[USACO06NOV]CornFieldsG题解这是一道典型的状压dp,对于\(M\)行\(N\)列的图,由于每个点只有\(1\)和\(0\)两种状态,我们将其压缩为一个长度为\(M\)的数组,数组(\(g\))的每一项\(g_{i}\)表示状态的二进制表示法表示的数(如\(101\)表示为\(5\)),我们预先处......
  • A Method of Setting the LiDAR Field of View in NDT Relocation Based on ROI
    基于ROI的NDT重定位激光雷达视场设置方法期刊:MDPI单位:山东理工大学摘要:在高精度地图自动导航的重定位图中,激光雷达布放和视场选择起到检测车辆相对位置和位姿的作用。当激光雷达视场被遮挡或激光雷达位置错位时,很容易导致重定位丢失或重定位精度低。针对遮挡视场过大时ND......
  • uname
    作用用于相似操作系统信息,包括内核版本、主机名、处理器类型等。语法uname[-amnrsv][--help][--version]参数说明-a,--all:按如下次序输出所有信息,其中若-p和-i的探测结果为未知,则省略。-s,--kernel-name:输出内核名称。-n,--nodename:输出网络节点的主......
  • ONLYOFFICE 8.2版本使用心得与评测
    文章目录ONLYOFFICE8.2版本使用心得与评测一、界面与操作体验二、兼容性与文件格式支持三、强大的协作功能四、个性化的品牌定制功能五、电子表格与演示文稿功能六、新功能的体验与感悟七、开源社区的力量总结ONLYOFFICE8.2版本使用心得与评测自从ONLYOFFICE这款......
  • vue3 antd 报错:please transfer a valid name path to form item
    在使用antd时多层嵌套循环表单时校验会报如下错误:pleasetransferavalidnamepathtoformitem原因:是循环体和字段无法绑定解决如下:<a-form><divv-for="(item,index)inform.List":key="index"><a-form-item:name="['List',index,&......
  • springboot项目使用JpaRepository后启动报错A component required a bean named 'XXX'
    在最近的项目中我使用了JpaRepository作为数据处理的接口,但在调用接口时始终报错,经过查询后发现问题出在导入的包不对,我导入的包为org.springframework.dataspring-data-jpa2.6.9应该导入的包为org.springframework.bootspring-boot-starter-data-jpa2.6.9spring-dat......