2014-10-17 3 views
0

Возможно ли в Mongoose выполнить запрос, в соответствии с которым двумя из параметров поиска являются ObjectIds (один из них является ref)?Mongoose Query с использованием нескольких 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) 

      }, ...); 

Что я здесь делаю неправильно? Я вижу необработанные данные в базе данных, но запрос всегда пуст, если я использую оба объекта ObjectIds в одной и той же находке.

Большое спасибо

ответ

1

Ну блин, я просто решил его через несколько часов смотрел на моем экране.

Когда вы вставляете документ Bar, вы должны явно указывать Mongoose, значение ref, о котором идет речь, является ObjectId, похоже, даже если это значение появилось из экземпляра Foo, где _id определяется как ObjectId! Go figure. Думаю, Mongoose принуждает его к String в противном случае?

(new schemas.Bar({ 

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

И, наконец, это работает! Надеюсь, это поможет другим разобраться в этом!

Смежные вопросы