通过ObjectId查询Mongoose Schema

时间:2013-02-21 13:06:27

标签: node.js mongoose objectid

再次需要你的帮助,希望这个项目,我在这里的答案将是最后一个。我已经看到它是一个相当常见的问题,但我已经尝试了另一个Stack Overflow post上的提示,以及Google Group提出的一个提示,但解决方案尚未解决问题。为我工作。

我的代码有点像:

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();

但我没有得到任何结果,我知道有。

非常感谢提前!

更新

已经最小化了上面的代码示例,如果我自己查询字符串值,则此测试有效,只查询ObjectId是否失败,我知道它存在。

JSON UPDATE

以下是我要找的内容:

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

突然之间,我相信我的回答已经清楚了。是因为venue_id实际上是一个字符串?如果是这样,我可以按原样保留我的mongoose模式,并在查找字符串时对查询进行强制转换吗?或者我应该更改这些值的存储方式(从我开发的单独的.net应用程序中)作为ObjectId&s进行插入?

目前正在进行另一个查询,当前的mongoose模式和数据库[实际设置]的方式,使用populate()可以很好地填充引用表(venue_id)的结果,方法是这个模型是目前设置,只有上述查询的差异,我没有指定venue_id ...

感谢。

1 个答案:

答案 0 :(得分:2)

是的,问题正在发生,因为架构中的venue_id的数据类型(ObjectId)与doc(String)中的数据类型不匹配。所以find正在查找ObjectId值,但找不到匹配项,因为它是doc中的字符串。

正确的解决方法是编写一个小程序来将文档中的venue_id值更新为ObjectIds而不是字符串,然后您的查询将起作用。这也会将这些字段的大小从24个字节缩小到12个。