2016-06-13 205 views
2

我使用的MongoDB和貓鼬用的NodeJS(表達),一切工作正常,除了這個功能:貓鼬按字段查找?

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

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

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

 
    }); 
 

 
});

它帶回在促銷空數組,但我有文件在我的數據庫。

該問題似乎與「{active:」true「}」中的字段激活有關。當我查找沒有任何過濾器的文檔時(使用「find({},...」)它工作正常。

當我運行mongo中的db.promotions.find({active:「true」}) 。

這是我的推廣模式:

// 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' 
     } 
}); 

否則,定義爲架構中的一個Booleanactive,貓鼬會施放任何active查詢中的值爲truefalse,這與您的文檔中的'true''false'字符串值不匹配。

當然,如果active實際上應該在你的文檔一個布爾值,那麼你需要讓他們配合您現有的模式來更新您的所有文檔。這比使用布爾值的字符串值更好。

+0

非常感謝!這是問題所在。我在mongoDB中將文檔更改爲布爾值,因爲這是他們本來應該首先考慮的。 –

+0

爲我工作,謝謝! –