нет результата с mongoose .find () при просмотре массива одного документа - PullRequest
0 голосов
/ 26 мая 2019

Я знаю, что я неправильно форматирую запрос, но я не могу получить записи в документе из вложенного массива. То, что я пытаюсь сделать, это получить все объекты в массиве с определенным значением в поле меню.

Я также использую 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
}
]

Что такое правильное форматирование, чтобы получить что-то вроде приведенного ниже возврата, если бы я ударил API с /dropDowns/frequencyOptions

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 голосов
/ 27 мая 2019

В итоге я просто создал новую коллекцию только для выпадающих опций, арендатор отсортирует их соответствующим образом для этой страницы, и я могу затем выполнить прямую сортировку с .find({name:req.param.name}) в соответствии с необходимостью массива.Возможно, позже, когда я получу больше знаний о том, как обрабатывать возвращаемые данные, я вернусь к извлечению и анализу массива по мере необходимости.

0 голосов
/ 26 мая 2019

Mongo doc довольно хорошо сделан: find ()

метод find возвращает курсор.Вам нужно вызвать .toArray (), чтобы превратить курсор в массив json.Вы можете использовать разбиение на страницы, если есть много результатов, например, с помощью skip / limit.

Для остальной модели я бы напрямую возвратил массив dropDowns, нет необходимости вставлять его в объект со свойством dropDowns.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...