2015-05-20 63 views
0

我有一個文檔這樣的貓鼬:選擇方法不返回包括現場

var ConfigSchema = new Schema({ 
    basicConfig: { 
    levelId: { 
     type: Number, 
     required: true 
    }, 
    hostId: { 
     type: Number, 
     required: true 
    }, 
    Name: { 
     type: String, 
     trim: true 
    }, 
    Settings: { 
     Type1: { 
     // some types here... 
     } 
     Type2: { 
     // some types here... 
     } 
    } 
    }, 
    enrolls: { 
    name: {type: String}, 
    list: [String] 
    }, 
    awards: { 
    enable: {type: Boolean}, 
    Primary: { 
     amount: {type: Number}, 
     type: {type: String} 
    } 
    } 

現在我想找到configshostId比賽60,並選擇basicConfig領域。

Config.findOne({ 'basicConfig.hostId': 60 }) 
    .select('basicConfig').exec(function(err, configs) { 
     if (err) { 
      console.error(err); 
      return ; 
     } 

     console.log(configs); 
    }); 

但是,該文件的所有字段將被退回。看起來select不起作用?爲什麼?

輸出:

{ _id: 555c4144c0bff1541d0e4059, 
    enrolls: {}, 
    awards: { primary: { PrimarySettings: {}, primaryAck: {} } }, 
    basicConfig: 
    { levelId: 24, 
    hostId: 60, 
    poolName: 'LC' } } 

而且,那些以下代碼已經測試,這是行不通的。

BonusConfig.findOne({ 'basicConfig.hostId': 60 }, 'basicConfig', function(err, configs) { 
     if (err) { 
      console.error(err); 
      return ; 
     } 
     console.log(configs); 
    }); 

但是,沒有與select用以下代碼的basicConfig領域,它工作得很好。

BonusConfig.findOne({ 'basicConfig.hostId': 60 }) 
    .select('-basicConfig').exec(function(err, configs) { 
     if (err) { 
      console.error(err); 
      return ; 
     } 
     console.log(configs); 
    }); 

我的代碼有什麼問題?

貓鼬版:24年3月8日

MongoDB的版本:2.6.7

編輯1

下面是查詢日誌中貓鼬調試模式。

Mongoose: configs.findOne({ 'basicConfig.hostId': 60 }) { fields: { basicConfig: 1 } }

編輯2

經過進一步調查。

Config.findOne({ 'basicConfig.hostId': 60 }).select('basicConfig')輸出結果:

{ _id: 555c4144c0bff1541d0e4059, 
    enrolls: {}, 
    awards: { primary: { PrimarySettings: {}, primaryAck: {} } }, 
    basicConfig: 
    { levelId: 24, 
    hostId: 60, 
    poolName: 'LC' } } 

其它字段是除basicConfig空值。然而,我想要的結果是

{ _id: 555c4144c0bff1541d0e4059, 
    basicConfig: 
    { levelId: 24, 
    hostId: 60, 
    poolName: 'LC' } } 
+0

你可以通過mongo客戶端運行相同的查詢嗎?你能否包含你想要匹配的實際文檔,只是爲了確保它不是數據問題? –

+0

使用此命令'db.bonusconfigs.find({'basicConfig。hostId':60},{'basicConfig':1})'在mongo客戶端中,它可以正確獲取數據 – zangw

回答

0

報價this

此行爲是設計,但無可否認它不是非常精心設計的。 Mongoose在從數據庫加載時創建子文檔時過分渴望。計劃在v5中改變這一點。

1

您需要返回的字段的投影缺少額外的參數。試試這個:

BonusConfig.findOne({ 'basicConfig.hostId': 60 }, {'basicConfig':1}, function(err, configs) { 
     if (err) { 
      console.error(err); 
      return ; 
     } 
     console.log(configs); 
    }); 
+0

它不起作用,並且在調試模式下輸出。 'Mongoose:configs.findOne({'basicConfig.hostId':60}){fields:{basicConfig:1}}' – zangw