2016-05-31 6 views
0

Я использую мангуста заполнить список данных, таких как:Почему mongoose populate возвращает мне незаконный массив и как с ним работать?

Account.findOne({_id:accountId}).populate({ 
      path:"orders.order", 
      match:{_id:orderId}, 
      selecte:'', 
      options:{ 
       limit:1 
      } 
      }).exec(function (err, doc) { 
       if (err) { 
       callback(err); 
       } 
       callback(doc); 
      }) 
     } 

и что я получаю:

[ { order: null }, 
    { order: null }, 
    { order: null }, 
    { order: null }, 
    { order: null }, 
    { order: null }, 
    { order: 
    { date: Tue May 31 2016 12:56:36 GMT+0800 (HKT), 
     dishs: [Object], 
     __v: 0, 
     message: 'plz deliver after 5 p.m', 
     price: 5, 
     address: [Object], 
     shop: null, 
     user: 574bfebc29cf722c17f8eafe, 
     _id: 574d198451615ce01a5e1a81 } } ] 

Я думаю, что эти данные массив, но

   console.log(typeof doc.orders);//object 
       console.log(doc.orders.length);//undefined 
       console.log(doc.orders[0].order);//error 
       console.log(Array.isArray(doc.orders));//false 

Я не знаете, как удалить нулевое значение этих данных и как изменить эти данные в массиве?

Кстати, я нашел сообщение в gist, что mongoose populate.match вернет значение null, если оно не соответствует условию, это правда?

ответ

0

Я ошибаюсь, что я неправильно определяю схему.

Неправильная схема:

orders:{order: [{type: mongoose.Schema.Types.ObjectId, ref:'Order'}] } 

Право образом определить схему в массив, который вы, что заселить:

orders:{type:[{ 
    order:{type: mongoose.Schema.Types.ObjectId, ref:'Order'} 
}]} 

После этого, использование populate.match даст вам юридическое массив, и вы можете сделать с ним, как обычный массив.