调查单个文档的数组时,猫鼬.find()没有结果

时间:2019-05-26 19:33:25

标签: mongodb express mongoose

我知道这是我格式化查询的方式不正确,但是我似乎无法从嵌套数组中获取文档中的条目。我正在尝试做的是在菜单字段中检索具有特定值的数组中的所有对象。

我也在使用mongo-tenant,因此Settings对象已经限于集合中的单个文档,因为它是该租户设置中的唯一文档。 (req.params.db在网址中的引用比可见路由更早)

到目前为止,基于许多谷歌搜索,我已经尝试过

.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"
},
}

我仍在构建数据库的结构,因此,如果有一种更有效的方法来收集此类数据,那么我也欢迎提出建议。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

Mongo文档做得很好:find()

find方法返回一个游标。您需要调用.toArray()将光标作为json数组。 如果结果很多,则可以使用分页,例如使用跳过/限制。

对于其余模型,我将直接返回dropDowns数组,而无需将其嵌入具有dropDowns属性的对象中。

答案 1 :(得分:0)

我最终只是为下拉选项创建了一个新集合,租户将对该页面进行适当的排序,然后我可以使用.find({name:req.param.name})来直接排序toArray的需求。也许稍后,当我获得有关如何处理返回值的更多知识时,我将视需要重新访问拉取和解析数组。