【问题标题】:Query Mongoose Schema by ObjectId通过 ObjectId 查询 Mongoose Schema
【发布时间】:2013-02-06 19:42:39
【问题描述】:

再次需要您的帮助,希望对于这个项目,我在这里所拥有的答案将是最后一个。我已经看到这是一个相当常见的问题,但我已经尝试过另一个 Stack Overflow postGoogle 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 更新

这就是我要找的东西:

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

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

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

谢谢。

【问题讨论】:

  • 什么是obj.venue_id?
  • 您能否提供一个重现该问题的最小示例?如果没有文档和您使用的 obj.venue_id 值,您将很难提供帮助。
  • 您能否同时显示您要查找的文档的 JSON?

标签: node.js mongoose objectid


【解决方案1】:

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

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

【讨论】:

  • 补充一点,我相信当猫鼬模式将值类型指定为Schema.Types.ObjectId 时,它会在实际执行查询时将字符串转换为该类型。
猜你喜欢
  • 2015-11-26
  • 2016-06-13
  • 2013-02-06
  • 2019-04-12
  • 2019-08-19
  • 2015-03-01
  • 2018-06-11
  • 2019-12-09
  • 2014-07-01
相关资源
最近更新 更多