Отображение курсора и для каждого неработоспособного mongodb и mongoose

#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 не определено. Я собираюсь принять ваш ответ.