2016-06-13 5 views
2

Я использую MongoDB и мангуста с nodejs (экспресс) и все работает отлично, за исключением этой функции:Mongoose найти по полю?

router.get('/', function(req, res, next) { 
 

 
    promotions.find({active:"true"},function(err,promo){ 
 
     if (err) throw err; 
 

 
     res.render('index', 
 
      { 
 
       promos: promo 
 
      }); 
 

 
    }); 
 

 
});

Это возвращает пустой массив в промо, но у меня есть документы в моем db.

Проблема, похоже, связана с активным полем "{active:" true "}". Когда я ищу документы без фильтра (с помощью «find ({}, ...»), он отлично работает.

Когда я запускаю db.promotions.find ({active: "true"}) в mongo, он работает .

Это мое продвижение схемы:

// grab the things we need 
 
var mongoose = require('mongoose'); 
 
var Schema = mongoose.Schema; 
 

 
// create a schema 
 
var promotionSchema = new Schema({ 
 
    title: String, 
 
    subtitle: String, 
 
    url: String, 
 
    image: String, 
 
    active: 
 
     { 
 
      type: Boolean, 
 
      default: false 
 
     } 
 
}); 
 

 
var Promotion = mongoose.model('Promotion', promotionSchema, 'promotions'); 
 

 
// make this available to our Node applications 
 
module.exports = Promotion;

Это то, что я получаю в MongoDB:

enter image description here

Я пробовал все возможные форматы {active: true} ({"active": "true"}, {"active": true} и т. Д.), И ничего не работает.

+0

Я думаю, что db.Promotions.find() просто вернется пустым! Проверь это! –

ответ

3

типы данных полей, как это определено в вашем схема должна соответствовать типам данных полей в документе.

Итак, потому что active является строкой в ​​документах, вы должны определить его в качестве строки в вашей схеме, а также:

var promotionSchema = new Schema({ 
    title: String, 
    subtitle: String, 
    url: String, 
    image: String, 
    active: 
     { 
      type: String, 
      default: 'false' 
     } 
}); 

В противном случае, с active определяется как Boolean в вашей схеме, Mongoose будет отбрасывать любые active в вашем запросе значение true или false, которое не соответствует строковым значениям 'true' и 'false' в ваших документах.

Конечно, если на самом деле activeдолжна быть булевой в вашей документации, то вам необходимо обновить все документы, чтобы они соответствовали существующей схеме. Это было бы предпочтительнее использовать строковые значения для булевых.

+0

Большое вам спасибо! Это была проблема. Я изменил свои документы на Boolean в mongoDB, потому что именно они должны были быть в первую очередь. –

+0

Работал для меня, спасибо! –

0

Вам нужно дождаться загрузки подписки, особенно на корневом (по умолчанию) маршруте. Попробуйте переместить находку помощника в index шаблона и завернуть его (или макет) в реактивном {{#if Template.subscriptionsReady}} блоке

Смотрите также:

https://www.discovermeteor.com/blog/template-level-subscriptions/

Смежные вопросы