Query Mongoose Schema by ObjectId



再次需要您的帮助,希望对于这个项目,我在这里得到的答案将是最后一个。我看到这是一个很常见的问题,但我在另一篇Stack Overflow帖子上尝试过这些技巧,也是谷歌集团的一篇帖子,但这些解决方案对我不起作用。

我的代码有点像:

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更新

以下是我想要的:

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

突然间,我相信我的答案已经很清楚了。这仅仅是因为venue_id实际上是一个字符串吗?如果是这样的话,我能保持我的猫鼬模式的原样吗?在查找字符串时对查询进行强制转换吗?或者我应该改变这些值的存储方式(从我开发的一个单独的.net应用程序中),将其作为ObjectId插入吗?

目前,对于另一个查询,当前的mongoose模式和数据库的[实际设置]方式,使用populate()可以很好地用当前设置该模型的方式填充引用表(venue_id)的结果,唯一的区别是在上面的查询上,我没有指定venue_id。。。

谢谢。

没错,问题发生的原因是架构(ObjectId)中venue_id的数据类型与文档(String)中的数据类型不匹配。因此,find正在查找ObjectId值,但找不到匹配项,因为它是文档中的一个字符串。

正确的解决方法是编写一个小程序,将文档中的venue_id值更新为ObjectId,而不是字符串,然后查询就可以工作了。这也将把这些字段的大小从24字节缩减到12字节。

最新更新