为什么mongoose populate会给我一个非法阵列以及如何处理它?

时间:2016-05-31 05:15:27

标签: node.js mongoose mongoose-populate

我使用mongoose填充数据列表,如:

 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值,是真的吗?

1 个答案:

答案 0 :(得分:0)

我错误地认为我以错误的方式定义了架构。

错误的架构:

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

在数组中定义架构的正确方法,你要填充什么:

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

在此之后,使用populate.match将为您提供一个合法的数组,您可以像普通数组一样使用它。