使用多个ObjectIds的Mongoose查询(使用' ref')

时间:2014-10-17 16:01:09

标签: javascript node.js mongoose

在Mongoose中是否可以执行一个查询,其中两个搜索参数是ObjectIds(一个是ref)?

例如,给定以下模式:

var ObjectId = mongoose.Schema.ObjectId;

var fooSchema = new mongoose.Schema({
    ...
});

schemas.Foo = mongoose.model("Foo", fooSchema, "foo");

var barSchema = new mongoose.Schema({

    fooId : { type: ObjectId, ref: "Foo" },
    ...
});

schemas.Bar = mongoose.model("Bar", barSchema, "bar");

我希望这可行:

        schemas.Bar.find({ 

             _id        : mongoose.Types.ObjectId(req.params.barId),
             fooId      : mongoose.Types.ObjectId(req.params.fooId)

           }, 
           function(err, result)
           {
             ...
           }
        );

但它返回一个空集。奇怪的是,如果我删除其中一个或另一个标准。

        schemas.Bar.find({ 

             _id        : mongoose.Types.ObjectId(req.params.barId)

           }, ...);

...或

        schemas.Bar.find({ 

             fooId          : mongoose.Types.ObjectId(req.params.fooId)

           }, ...);

我在这里做错了什么?我可以在数据库中看到原始数据,但如果我在同一个查找中同时使用两个ObjectId,则查询始终为空。

非常感谢

1 个答案:

答案 0 :(得分:1)

该死的,我在几个小时的盯着屏幕后才解决了。

当你插入一个Bar文档时,你必须明确地告诉Mongoose,所讨论的ref值似乎是一个ObjectId,即使该值来自一个Foo实例,其中_id被定义为ObjectId!去图..我猜Mongoose会将它强制转换为字符串吗?

   (new schemas.Bar({

        fooId : mongoose.Types.ObjectId(somePreviouslyRetrievedFoo._id),
        ...
    })).save(...)

最后,它有效!希望这有助于其他人绊倒它!