mongoose中的populate之多级填充,嵌套字段填充?

在mongoose中存引用的时候如果是多级,查询的时候填充引用字段会使用populate,如下:

定义一个User,有字段friends每一项是自己collection的ObjectId。

// file: user-schema.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectIdmodule.exports = new mongoose.Schema({name: String,friends: [{type: ObjectId, ref: 'User'}]
})
// file: user-model.js
let mongoose = require('mongoose')
let userSchema = require('./user-schema.js')module.exports = mongoose.model('User', userSchema)

定义一个commentSchema有字段from是User的_id,还有嵌套字段reply每一项是一个document有字段from和to都是User的_id

// file: comment-schema.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectIdmodule.exports = new mongoose.Schema({from: {type: ObjectId, ref: 'User'},content: String,reply: [{to: {type: ObjectId, ref: 'User'},from: {type: ObjectId, ref: 'User'},content: String}]
})

下面开始查询。

// file: comment-model.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectIdmodule.exports = mongoose.model('Comment', userSchema)
let Comment = require('./comment-model.js')Comment.findOne({}).populate('from') // 填充from字段.populate('reply.to reply.from') // 填充reply字段下的to和from

注意:reply下的字段to和from的填充,并不是mongoose官文populate章节中的多级填充。

// file: comment-model.js
Coment.findOne({}).populate({path: 'from', populate: {path: 'friends'}})

填充from字段查询出来的结果中的friends字段才是多级填充。

多级指的是需要填充的字段是在查询出来的数据对应的Schema中定义的。而第一个查询的填充类型的定义都是在comment-schema.js中,无论是from字段还是reply下面的to和from。而第二个查询的字段from是在comment-schema.js中定义,但是查询出来的document User 中的friends字段则是在user-schema.js中定义的。

我的理解是:准确的说多级是需要填充的字段是填充过后出现的。而字段的嵌套不能说是多级,至少我是这么认为的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习优化基础

1、网络优化参数 sigmoid函数:1/(1e^(-x))::便于求导的平滑函数,但是容易出现梯度消失问题;函数中值不是0,会导致模型训练的收敛速度变慢。。。 tanh函数:(e^x-e^(-x))/(e^xe^(-x))::解决了zero…

稳定高效大型系统架构---集群中间件开发

那现在来说,稳定的中间件应该是什么样子呢? 对于客户端请求,如果发现服务停止,可以实现服务无缝转移---这叫不丢失任何服务. 对于多个客户端请求,可以讲请求轮巡到不同的服务器上&am…

css实现web前端最美的loading加载动画!

这些好看的loading效果,你还只会用第三方库吗?CSS3教你实现 ​前言 loading效果在实际开发中是很常见的,尤其是在Ajax请求的时候,可以给用户一个很好的交互体验。 今天这篇文章我们一起来看看如何通过CSS3实现各种不同的loadin…

如何使用Hibernate从Play生成DDL脚本! 框架项目

好的,因此您一直在使用hibernate属性名称“ hibernate.hbm2ddl.auto ” value “ 更新 ”来不断更新数据库架构, 但是现在您需要一个完整的DDL脚本吗? 从您的Global Class onStart中使用此方法来导出DDL脚本。 只需为其提供实体的包名称&…

C# 设计模式,工厂方法

C#工厂方法 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace 工厂方法 {8 class Program {9 static void Main(string[] args) { 10 IFacotry i new Fact…

javascript中令人迷惑的this

JS中的this很多时候会让人捉摸不透,不知道这个this到底指向的是什么。现在根据自己的理解写下这篇文章做一个总结。 我们知道this指向谁一般情况下是在运行时决定的,并且运行时决定this指向的因素又有很多,例如是不是被bind了,或…

容易忽视但是功能灰常强大的Java API(五. 二分查找)

五. 二分查找 二分查找是一个高效的查找算法,在java的集合对象中也提供了二分查找的算法,如下面的java api接口: java.util.Arrays.binarySearch(java.lang.Object,java.lang.Object,java.util.Comparator) java.util.Arrays.binarySear…

打印 PRINT

打印 PRINT 字符串和数值类型 可以直接输出。 print(1) #out:1 print(a) #out:a 变量 无论什么类型,数值,字符串,列表,字典...都可以直接输出 n 1 s a list_a [1,3,4] dict_c {a:3,b:4} print(n) #out&…

css3帮你轻松实现圆角效果,不一样的前端页面。

在Web前端页面实现圆角效果,CSS3帮你轻松实现,一个人人皆知的属性 圆角边框的绘制是Web页面和Web应用程序中经常用来美化页面效果的手法之一。今天,小编为大家介绍CSS3提供的可以将矩形变为圆角矩形的一个属性 技术等级:中级 | 适…

使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部

我有一个需要在完成某些工作时通知用户的应用程序。 它使用JSF和Primefaces,因此可以使用大气 (也称为Push)来实现这种通知。 但是另一个有趣的方法是使用嵌入在Java Web应用程序中的XMPP服务器。 好的,好的,您不必嵌…

appium和selenium不同与相同之处

原文来自: https://www.cnblogs.com/zhengshuheng/p/6370398.html selenium是web端的自动化,appium是app端的自动化,它继承了webdriver(也就是selenium 2) 转载于:https://www.cnblogs.com/lv-lxz/p/11118862.html

Mockito 101

Mockito是一个模拟框架,可让您使用简洁的API编写漂亮的测试。 它偏向于最低规格,使不同的行为看起来有所不同,并显示清晰的错误消息。 创造嘲弄 要使用Mockito创建模拟,只需使用Mock注释模拟,然后调用MockitoAnnotati…

前端开发常用代码片段(下篇)

二十二、正则表达式 //验证邮箱/^\w ([0-9a-zA-Z] [.]) [a-z]{2,4}$///验证手机号/^1[3|5|8|7]\d{9}$///验证URL/^http:\/\/. \.///验证身份证号码/(^\d{15}$)|(^\d{17}([0-9]|X|x)$)///匹配字母、数字、中文字符/^([A-Za-z0-9]|[\u4e00-\u9fa5])*$///匹配中文字符/[\u4e00-\u9…

使用 Visual Studio 编译 wget 为库文件

添加代码与预编译指令与上一篇使用 Visual Studio 编译 wget 为可执行文件一致,区别在于这回建的是静态库工程(编译为动态库过程类似:)) 从wget的main函数开始读下来,发现问题不少,程序可能基于效率或者编码方便的因素…

动态规划(0-1背包)--- 改变一组数的正负号使得它们的和为一给定数

改变一组数的正负号使得它们的和为一给定数 494. Target Sum (Medium) Input: nums is [1, 1, 1, 1, 1], S is 3. Output: 5 Explanation:-11111 3 1-1111 3 11-111 3 111-11 3 1111-1 3There are 5 ways to assign symbols to make the sum of nums be target 3. 题目描述…

关于设计模式的胡思乱想

设计模式是一个指导,并不强制。有很多地方并不需要设计模式介入,因为设计模式是分离变化,很多代码是一次性的,不会变。如果我们一开始写程序的时候就加入设计模式,这样就显得过度设计,既耗时又费力。 并且…

JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

借助JSR 310,Java 8终于为我们带来了不错的日期和时间API。 对于仍在使用Java 7的那些人(例如我目前在我的当前项目中),有很好的反向移植,请访问www.threeten.org了解更多详细信息。 但是,由于有关该主题的…

H5之audio标签放音兼容所有浏览器方法

前端交流群&#xff0c;群文件提供大量文档、书籍和资料。期待你的加入&#xff01;群号&#xff1a;127768464 由于项目需要&#xff0c;最近刚做了一个网页放音的功能&#xff0c;使用到了H5新标签<audio></audio>&#xff0c;但是audio只能支持IE8以上的浏…

VisualStudio2010 SP1 SP1 SDK SQLServer 2008 SP3 下载地址

SP1:http://go.microsoft.com/fwlink/?LinkId210710 SP1 SDK:http://www.microsoft.com/download/en/details.aspx?id21835 SQLServer2008 sp3:http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid757bca07-7b52-46fb-ab92-476be9339442&displaylangzh-cn …

python高级特性:迭代器与生成器

前言 有一个列表 l [a,b,c,d,e] 我想取列表中的内容&#xff0c;有几种方式&#xff1f; # 1.最简单的方法用for循环。 for i in l:print(i,end" ") # 2.用列表内置的方法。 while 1:if l:print(l.pop(),end" ") 这是用常见的方式取出列表中的数据。 …