2013-09-02 3 views
0
var SecuritySchema = new Mongoose.Schema({ 
     _bids: [{ 
      type: Mongoose.Schema.Types.ObjectId, 
      ref: 'BuyOrder' 
     }], 
     _asks: [{ 
      type: Mongoose.Schema.Types.ObjectId, 
      ref: 'SellOrder' 
     }] 
    }); 

    var OrdersSchema = new Mongoose.Schema({ 
     _security: { 
      type: Mongoose.Schema.Types.ObjectId, 
      ref: 'Security' 
     }, 
     price: { 
      type: Number, 
      required: true 
     }, 
     quantity: { 
      type: Number, 
      required: true 
     } 
    }); 


    // declare seat covers here too 
    var models = { 
     Security: Mongoose.model('Security', SecuritySchema), 
     BuyOrder: Mongoose.model('BuyOrder', OrdersSchema), 
     SellOrder: Mongoose.model('SellOrder', OrdersSchema) 
    }; 
    return models; 

И чем тогда, когда я сохраняю новую BuyOrder, например:Mongoose Отношения Populate не возвращает результаты

// I put the 'id' of the security: order.__security = security._id on the client-side 
var order = new models.BuyOrder(req.body.order); 
    order.save(function(err) { 
     if (err) return console.log(err); 
    }); 

И попытаться повторно получить соответствующую безопасность:

models.Security.findById(req.params.id).populate({ 
     path: '_bids' 
    }).exec(function(err, security) { 
     // the '_bids' array is empty. 
    }); 

I думаю, что это своего рода проблема с именами, но я не уверен, я видел примеры here и на веб-сайте moongoose, которые используют Number как Id Тип: http://mongoosejs.com/docs/populate.html

ответ

0

Поле ref следует использовать единственное название модели

Кроме того, просто сделать:

models.Security.findById(req.params.id).populate('_bids').exec(... 

Мой главный подозрение дал свой фрагмент кода на данный момент ваша req.body.order имеет _security в виде строки вместо массива, содержащего строку.

Кроме того, вам не нужна недвижимость id. Mongodb сам автоматически выполнит _id как настоящий BSON ObjectId, а mongoose добавит id в виде строкового представления того же значения, поэтому не беспокойтесь об этом. (? И круговой характер его)

+0

Awesome- так как '_security: { типа: Mongoose.Schema.Types.ObjectId, исх: 'Безопасность' }' Должен ли я определить новый тип особой модели? Я попробую! Хорошие волосы кстати! Скоро отчитается. –

+0

Он по-прежнему не работает - я обновился выше –

+0

Обновлен мой ответ с другой целью, но можете ли вы отправить точное содержимое 'req.body.order'? –

-1

В то время как я не понимаю вашу схему, этот код работает:

var order = new models.BuyOrder({ price: 100, quantity: 5}); 
order.save(function(err, orderDoc) { 
    var security = new models.Security(); 
    security._bids.push(orderDoc); 
    security.save(function(err, doc) { 
     models.Security.findById({ _id: doc._id }) 
      .populate("_bids").exec(function(err, security) { 
       console.log(security); 

      }); 
    }); 
}); 

Он:

  1. создает BuyOrder
  2. save оно что
  3. создает Security
  4. добавить s в массив _bids новые orderDoc «ы _id
  5. сохраняет его
  6. поиски матча и заполняет

Обратите внимание, что есть не автоматический способ добавления документа в массив _bids, так Я сделал это вручную.

Результаты:

{ _id: 5224e73af7c90a2017000002, 
    __v: 0, 
    _asks: [], 
    _bids: [ { price: 100, 
      quantity: 5, 
      _id: 5224e72ef7c90a2017000001, __v: 0 } ] } 
+0

Ну, что касается «кругового», мне не нужен какой-то способ связать новый «порядок» с «безопасностью»? Я получаю то, что вы делаете, когда «нажимаете» новый «порядок» на «_bids», но я не хочу создавать новую безопасность для каждого '_bid' или' _ask', я бы просто вызвал «обновление» после Я нажимаю новый «порядок» в массив? –

+0

Вам нужно будет связать новый заказ с безопасностью, если вы хотите иметь возможность двунаправленного поиска. Тебе решать. Вы просто вызываете 'update' и' $ push' новый элемент в массив в любое время, когда есть новый порядок. – WiredPrairie

+0

gotcha - это имеет смысл ... Я просто подумал, что могу создать «заказ» сам по себе, это как-то бод с документацией на странице мангуста и использованием процедуры «push». –

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