2013-02-21 71 views
3

希望再次需要您的幫助,希望對這個項目來說,我在這裏的答案將是最後一個。我已經看到這是一個相當常見的問題,但我已經嘗試了另一個Stack Overflow postGoogle Group之一的提示,但這些解決方案並未適用於我。通過ObjectId查詢Mongoose Schema

我的代碼是一個有點像:

mongoose = require('mongoose'); 
Schema = mongoose.Schema; 
mongoose.connect(MONGO_SERVER); 
ObjectId = Schema.ObjectId; 

var RacesSchema = new Schema({ 
    venue_id  : { type: mongoose.Schema.ObjectId, ref: 'Venues' }, 
    racetype   : String 
}); 
var races = mongoose.model('Races', RacesSchema); 

function test() { 
    var MyObjectId = require('mongoose').Types.ObjectId; 
    queryVenue = new MyObjectId("50e3dcdbf30375180c078f64"); 

    races.find({venue_id: queryVenue, racetype:'Test'}) 
    .exec(function(err,data) { 
} 

test(); 

但我沒有得到任何結果,我知道有。

非常感謝提前!

UPDATE

有最小化上面的代碼示例,這個測試工作,如果我查詢自身的字符串值,只是查詢的的ObjectId是它失敗了,我知道它的存在。

JSON UPDATE

以下是我在尋找:

{ 
    "_id" : ObjectId("50e3dcddf30375180c078f85"), 
    "venue_id" : "50e3dcdbf30375180c078f64", 
    "racetype" : "A" 
} 

而且突然的,我相信我的答案已經很清楚了我。僅僅是因爲venue_id實際上是一個字符串?如果是這樣,我可以保持我的貓鼬模式的方式,並在做查找是一個字符串的點查詢嗎?或者我應該改變這些值的存儲方式(從我開發的一個單獨的.net應用程序中)插入爲ObjectId的?

目前,對於另一個查詢,當前的mongoose模式和數據庫[實際設置]的方式,使用populate()可以很好地填充被引用表格(venue_id)的結果和該模型的方式目前正在設置中,唯一的區別就是上面的查詢,我沒有指定venue_id ...

謝謝。

+0

什麼是obj.venue_id? – 2013-02-21 13:23:36

+0

你能提供一個能夠再現問題的最小例子嗎?如果沒有文檔和您使用的'obj.venue_id'值,它將很難提供幫助。 – JohnnyHK 2013-02-21 14:42:14

+0

你也可以顯示你試圖找到的文檔的JSON? – JohnnyHK 2013-02-22 13:48:08

回答

2

沒錯,問題在發生,因爲模式(ObjectId)中的venue_id的數據類型與doc(字符串)中的數據類型不匹配。因此,find正在查找ObjectId值,但找不到匹配項,因爲它是文檔中的字符串。

對此的正確解決方法是編寫一個小程序,將文檔中的venue_id值更新爲ObjectId而不是字符串,然後您的查詢將起作用。這也將把這些字段的大小從24字節縮減爲12.

+0

非常感謝Johnny :)現在一切都很好。 – Jester 2013-02-25 10:37:45

+0

爲了補充說明,我相信當mongoose模式將一個值類型指定爲'Schema.Types.ObjectId'時,它將在實際執行查詢時將該類型的字符串轉換爲該類型。 – 2014-04-28 17:12:02