Запрос мангуста findOne не работает должным образом

Я использовал экспресс для создания этого веб-приложения. У меня также есть модель мангуста:

{
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  notes: [{
    name: { type: String, required: true }
  }]
}

Когда я пытаюсь найти объект внутри массива (примечания) ->

modelName.findOne({ "notes:" {$elemMatch: {"_id": req.body.id } }})
  .exec()
  .then(result => {
    console.info(result);
  })
  .catch(err => {
    console.info(err);
  });

Я получаю весь объект модели одного пользователя вместо одной заметки. Вот результат, который я получаю:

{
  "_id": "5c51dd8be279e9016716e5b9",
  "username": "user1",
  "password": "",
  "notes": [
    {
      "_id": "5c51dd8be279e901671gagag",
      "name": "name of note1"
    },
    {
      "_id": "5c51ff8be279e901671gagag",
      "name": "name of note"
    },
    {
      "_id": "5c51dd8be2131501671gagag",
      "name": "name of note"
    }
  ]
}

Однако я ожидаю получить что-то вроде этого:

{
  "_id": "5c51dd8be279e901671gagag",
  "name": "name of note1"
}

P.S: Это не дубликат этого ответа Mongoose Mongodb запрашивает массив объектов. Я уже пытался использовать код из этого вопроса, но это не решает мою проблему.

Возможный дубликат Mongoose Mongodb запрашивает массив объектов

lux 01.02.2019 16:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
644
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

findOne() работает нормально. findOne() возвращает любой документ, соответствующий указанному запросу, а не часть документа. Если вам нужна только часть этого документа, вам придется получить его в двух частях...

modelName.findOne({ "notes": {$elemMatch: {"_id": req.body.id } }})
.exec()
.then(result => {
  // Will get an array of notes whose _id === req.body.id
  const resNote = result.notes.filter(n => n._id === req.body.id);
  console.info(resNote);
})
.catch(err => {
console.info(err);
});

См. документацию здесь. Если вы заметили, там упоминается, что функция "находит один документ".

Это должны быть «примечания», а не «примечания:». Я попробовал и получил CoreMongooseArray[]

Genjik 01.02.2019 17:03

Вы имеете в виду, что это должен быть CoreMongooseArray? Или вы имеете в виду что-то вроде "Это интересный вопрос". Я не носитель языка, извините за глупый вопрос)

Genjik 01.02.2019 17:09

Это должны быть «заметки»: попробуйте приведенный выше код, результат должен быть одним документом. resNote должен быть массивом объектов, которые вы хотите.

ajbieber 01.02.2019 17:31

Омг, наконец-то заработало. Ваш ответ правильный, но из-за тройки '===' в методе фильтра я получал пустой массив. Я изменил его на двойное '==', и это работает. Спасибо))

Genjik 01.02.2019 18:01

Рад слышать!! Если вы хотите использовать === (что безопаснее, чем ==), вы должны написать вызов фильтра с помощью .toString(), например: result.notes.filter(n => n._id.toString() === req.body.id);

ajbieber 01.02.2019 18:14

Спасибо и за это) Я использую почтальон для выполнения запросов к API и пишу идентификатор как строку, но mongoDB возвращает идентификатор как целое число. Это была причина, почему он не работал должным образом

Genjik 01.02.2019 18:28

Другие вопросы по теме