查看单个文档的数组时,mongoose .find() 没有结果
Posted
技术标签:
【中文标题】查看单个文档的数组时,mongoose .find() 没有结果【英文标题】:no result with mongoose .find() when looking into array of a single document 【发布时间】:2019-10-12 11:30:48 【问题描述】:我知道是我错误地格式化了查询,但我似乎无法从嵌套数组中获取文档中的条目。我试图做的是在菜单字段中检索具有特定值的数组中的所有对象。
我也在使用mongo-tenant,因此设置对象已经被限制在集合中的单个文档中,因为它是该租户设置中的唯一文档。 (req.params.db 在 URL 中比可见路由更早地被引用)
到目前为止,我已经尝试过,基于许多谷歌搜索
.find() // returns entire object as below
.find(dropsDowns: menu: $eq: req.params.menu ) // returns []
.find( dropsDowns: menu: req.params.menu ) // returns []
.find('dropDowns.menu':req.params.menu) // returns entire object
.find( ['dropDowns.menu']: req.params.menu ) // returns entire object
我还尝试了几种形式的聚合方法,但结果并不理想,因为假设我实际上知道如何找到合适的东西进行聚合,而我显然不知道。
settingsRoute.route('/dropDowns/:menu').get(function(req, res)
const Settings = baseSettings.byTenant(req.params.db)
Settings.find().exec(function(
err,
menu
)
if (err)
return res.status(400).json(err)
res.status(200).json(menu)
)
)
这会将以下内容返回到我的浏览器
[
_id: "5cea1b835e13fb4180be2699",
dropDowns: [
_id: "5cea1b835e13fb4180be26a7",
menu: "frequencyOptions",
text: "Monthly",
value: 30,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
_id: "5cea1b835e13fb4180be26a6",
menu: "frequencyOptions",
text: "Every two months",
value: 60,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
_id: "5cea1b835e13fb4180be26a3",
menu: "meterIntervals",
text: "250",
value: 250,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
_id: "5cea1b835e13fb4180be26a2",
menu: "meterIntervals",
text: "500",
value: 500,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
_id: "5cea1b835e13fb4180be269e",
menu: "transitionIntervals",
text: "Due at normal interval",
value: 0,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
_id: "5cea1b835e13fb4180be269d",
menu: "transitionIntervals",
text: "Offset by 25% of normal",
value: 250,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.287Z",
updatedAt: "2019-05-26T04:52:19.287Z"
],
tenantId: "maxx1",
siteSettings:
siteTheme: "dark",
friendlyName: "No Name Set :(",
activeStatus: "transit",
previousStatus: "transit",
numBackupsToKeep: 10,
daysPerBackup: 7,
_id: "5cea1b835e13fb4180be26ad",
backups: [ ],
createdAt: "2019-05-26T04:52:19.287Z",
updatedAt: "2019-05-26T04:52:19.287Z"
,
createdAt: "2019-05-26T04:52:19.287Z",
updatedAt: "2019-05-26T04:52:19.287Z",
__v: 0
]
如果我要使用/dropDowns/frequencyOptions
访问 api,只有以下返回值的正确格式是什么
dropDowns: [
_id: "5cea1b835e13fb4180be26a7",
menu: "frequencyOptions",
text: "Monthly",
value: 30,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
_id: "5cea1b835e13fb4180be26a6",
menu: "frequencyOptions",
text: "Every two months",
value: 60,
tenantId: "maxx1",
createdAt: "2019-05-26T04:52:19.286Z",
updatedAt: "2019-05-26T04:52:19.286Z"
,
我仍在构建数据库的结构,所以如果有更有效的方法来收集此类数据,那么我也愿意接受建议。
感谢您的帮助。
【问题讨论】:
【参考方案1】:Mongo doc 做得很好:find()
find 方法返回一个游标。您需要调用 .toArray() 将光标转换为 json 数组。 如果有很多结果,你可以使用分页,比如跳过/限制。
对于其余模型,我将直接返回 dropDowns 数组,无需将其嵌入到具有 dropDowns 属性的对象中。
【讨论】:
如果我没有阅读文档,我就不会在这里。好多次了。最后,我想要做的是仅在其各个菜单选项的上下文中对项目进行预排序,因为有些按值排序,有些按文本排序。 这是使用 mongoose find ,它与根据这篇文章描述的光标不同,除非因为这个参考有点陈旧,所以改变了。 ***.com/a/20859457/8551436【参考方案2】:我最终只是为下拉选项创建了一个新集合,租户将为该页面适当地对它们进行排序,然后我可以使用.find(name:req.param.name)
直接排序到所需的 toArray。也许稍后当我获得有关如何处理返回的更多知识时,我将根据需要重新访问拉取和解析数组。
【讨论】:
以上是关于查看单个文档的数组时,mongoose .find() 没有结果的主要内容,如果未能解决你的问题,请参考以下文章
传递文档数组时,Mongoose 中 Model.create 的原子性
Mongoose - 使用 find() 查询文档,其中嵌套数组值的总和在一定范围内