Ваш запрос неверен.Вы пытались написать условие AND, но вы разделили документы вместо того, чтобы объединить все в один.Это означает, что «второй» аргумент Model.find()
был интерпретирован как «проекция полей», следовательно, ошибка:
MongoError: Неподдерживаемая опция проекции:
Так что это не «проблема схемы», а то, что вы отправили неверные аргументы в метод Model.find()
Также вам необходимо $elemMatch
для нескольких условий для элементов в массиве:
// Use a try..catch block with async/await of Promises
try {
let user = await Exerciser.find({
"username": name,
"exercises": {
"$elemMatch": { "date": { "$gte": from, "$lte": to } }
}
});
// work with user
} catch(e) {
// handle any errors
}
Самое главное, вы не await
обратного вызова.Вы либо await
Promise
, как я здесь показываю, либо просто передаете callback
вместо этого.Не то и другое.
Exerciser.find({
"username": name,
"exercises": {
"$elemMatch": { "date": { "$gte": from, "$lte": to } }
}
}).exec((err,user) => {
// the rest
})
К вашему сведению, вы пытались сделать следующее:
Exerciser.find({
"$and": [
{ "username": name },
{ "exercises.date": { "$gte": from }},
{ "exercises.date": { "$lte": to }}
]
)
Но на самом деле это все еще неправильно, поскольку без $elemMatch
$gte
и $lte
применяются ко ВСЕМ элементам массива, а не только к одному.Таким образом, неверные результаты будут отображаться, если ЛЮБОЙ элемент массива будет меньше, чем дата, но не обязательно будет больше, чем.
Для элементов массива $elemMatch
обеспечивает «между» двумя условиями.