Mongoose填充数组

时间:2017-07-18 13:27:51

标签: node.js mongodb mongoose

我尝试使用填充但没有成功... 可以这样做吗?

我有2谢玛: - 用户

import mongoose, { Schema } from 'mongoose'

const userSchema = new Schema({
  email: { type: String, unique: true },
  password: String,
  passwordResetToken: String,
  passwordResetExpires: Date,

  products: [{
    productId: { type: Schema.Types.ObjectId, ref: 'Product' },
    dateAdd: { type: Date, default: Date.now }
  }]
}, { timestamps: true })

const User = mongoose.model('User', userSchema)

export default User

和产品:

import mongoose, { Schema } from 'mongoose'

const productSchema = new Schema({
  domain: String,
  originUrl: { type: String },
  price: Number,
  img: String,
  userFollow: [{ type: Schema.Types.ObjectId, ref: 'User' }]
})

const Product = mongoose.model('Product', productSchema)

export default Product

所以我想检索每个 prodcutId

的所有信息

我尝试这种方式(还有许多其他方法没有成功):

User.findOne({ _id: userId }).populate({
      path: 'products.productId',
      populate: { path: 'products.productId', model: 'Products' }
}).exec(function (err, products) {
  if (err) {
    console.log('errors :' + err)
  }
  console.log('Product => ' + util.inspect(products))
})

Populate没有效果,只有findOne()

的结果相同

2 个答案:

答案 0 :(得分:1)

尝试使用MongoDB的aggregate功能和$ lookup

Users.aggregate([
    {
        "$match":
            {
                _id: user.id
            }
    },
    {
        "$lookup":
            {
                from: "Product",
                localField: "products",
                foreignField: "_id",
                as: "products"
            }
    }

])
.exec()
.then((result) => {
    //your result

})
.catch((err) => {
    // if any error
});

答案 1 :(得分:1)

我认为User.findOne({ _id: userId }).populate('products.productId')应该有用。