#node.js #mongodb #cursor #mongoose
#node.js #mongodb #курсор #mongoose
Вопрос:
Я пытаюсь найти все документы в коллекции с полем, представляющим собой массив с элементом, который соответствует определенному параметру из запроса. Я проверил следующее, но ни один из методов, похоже, не работает. Я использую узел mongodb и mongoose.
var cursor = db.Item.find({ cats: { $elemMatch: req.params.cat}});
cursor.map( function(myDoc) {console.log("myDoc.name: " myDoc.name)});
var cursor = db.Item.find({ cats: { $elemMatch: req.params.cat}});
cursor.foreach( function(myDoc) {console.log("myDoc.name: " myDoc.name)});
Ошибка, которую я получаю, заключается в том, что объект # не имеет метода ‘forEach’.
Любая помощь была бы отличной! Спасибо!
Комментарии:
1. является req.params.cat объект? это должен быть объект.
2. Это строка (не мой выбор), есть ли хороший способ сделать ее объектом вместо этого?
3. в документации говорится, что это должен быть объект. Если это строка, то почему вы все равно хотите использовать elemmatch? будут ли { кошки: req.params.cat } работать в одиночку?
4. Я полагал, что $elemMatch был необходим для массива. Что и есть cats. Я пытаюсь получить все документы, в которых совпадает хотя бы один элемент в cats req.params.cat .
Ответ №1:
Здесь есть несколько ошибок, учитывая, что вы используете Mongoose. Кажется, вы пытаетесь использовать синтаксис типа «shell», но в mongoose вы работаете с определениями моделей
var itemSchema = new Schema({
cats: []
});
var Item = mongoose.model( "Item", itemSchema );
И тогда предполагается, что ваш массив «cats» содержит только такие строки, как:
{
"cats": [ "fluffy", "mittens", "stripes" ]
}
Затем вы отправляете запрос из объекта «модель» и используете $in
оператор для сопоставления выбора. Кроме того, поскольку это «узел», результаты находятся в пределах обратного вызова и не возвращаются как результат «левой стороны»:
Item.find({ "cats": { "$in": [req.params.cat] } },function(err,cats) {
if ( err ) throw err; // handle errors in some way
console.log( JSON.stringify( cats, undefined, 4 ) );
});
Это просто приведет к удалению всех результатов, поскольку они «автоматически» преобразуются в массив. Вы, конечно, можете использовать итераторы и преобразователи массива так же, как .forEach()
или .map()
для результата отсюда.
Комментарии:
1. Спасибо! Однако получаю эту ошибку: { «$err»: «неверный запрос», «код»: 12580 }. Мне трудно найти что-нибудь полезное в Интернете по этому поводу. Все, что я могу сказать, это то, что это как-то связано с «$ in».
2. @Bren Да. мой плохой, забыл скобки
[]
вокруг аргумента to$in
, который принимает массив возможных совпадений.3. Это работает! Мне пришлось изменить параметры stringify на просто cats. Он жаловался, что undefined не определено. Я собираюсь принять ваш ответ.