Я использовал экспресс для создания этого веб-приложения. У меня также есть модель мангуста:
{
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 запрашивает массив объектов. Я уже пытался использовать код из этого вопроса, но это не решает мою проблему.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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[]
Вы имеете в виду, что это должен быть CoreMongooseArray? Или вы имеете в виду что-то вроде "Это интересный вопрос". Я не носитель языка, извините за глупый вопрос)
Это должны быть «заметки»: попробуйте приведенный выше код, результат должен быть одним документом. resNote должен быть массивом объектов, которые вы хотите.
Омг, наконец-то заработало. Ваш ответ правильный, но из-за тройки '===' в методе фильтра я получал пустой массив. Я изменил его на двойное '==', и это работает. Спасибо))
Рад слышать!! Если вы хотите использовать === (что безопаснее, чем ==), вы должны написать вызов фильтра с помощью .toString(), например: result.notes.filter(n => n._id.toString() === req.body.id);
Спасибо и за это) Я использую почтальон для выполнения запросов к API и пишу идентификатор как строку, но mongoDB возвращает идентификатор как целое число. Это была причина, почему он не работал должным образом
Возможный дубликат Mongoose Mongodb запрашивает массив объектов