查看单个文档的数组时,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() 查询文档,其中嵌套数组值的总和在一定范围内

Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

Mongoose:.find() 不返回任何文档

无法从 Mongoose 模型中获取文档“find”承诺

如何在 Mongoose 的嵌入式文档中检索数组的最后一个对象?