2013-02-21 86 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