Mongoose填充包含ref的对象数组

时间:2013-05-20 01:05:01

标签: mongoose

我有一个Mongoose模式,其数组lists包含对另一个集合的引用和嵌套的数字数组:

var Schema, exports, mongoose, schema;

mongoose = require("mongoose");

Schema = mongoose.Schema;

schema = new Schema({
  name: {
    type: String,
    required: true,
    unique: true,
    trim: true
  },
  lists: [
    {
      list: {
        type: Schema.ObjectId,
        require: true,
        ref: "List"
      },
      allocations: [
        {
          type: Number,
          required: true
        }
      ]
    }
  ],
  createdAt: {
    type: Date,
    "default": Date.now
  },
  updatedAt: {
    type: Date
  }
});

exports = module.exports = mongoose.model("Portfolio", schema);

但是,如果没有获得populate,我无法按预期工作TypeError: Cannot read property 'ref' of undefined。我已经尝试了populate('list')populate('lists list'),但我要么没有正确调用,要么我的架构没有正确形成。如果我只是自己引用这些列表,我就没有这个问题:

lists: [
    {
        type: Schema.ObjectId,
        require: true,
        ref: "List"
    }
  ]

但我希望在每个列表旁边都有分配数组。我需要做些什么来获得我想要的行为?

6 个答案:

答案 0 :(得分:77)

我找到答案:populate('lists.list')有效。感谢这个问题:Mongoose populate within an object?

答案 1 :(得分:3)

lists: [
   {
      list: {
          type: Schema.ObjectId,
          require: true,
          ref: "List"
      },
      allocations: [
          {
              type: Number,
              required: true
          }
      ]
   }
],

=>因为它是一个对象数组,所以您可以执行以下操作:: Portfolio.populate('lists.list');

2。

lists: [
    {
        type: Schema.ObjectId,
        require: true,
        ref: "List"
    }
]

=>因为它是一个数组,所以您只需执行以下操作-:Portfolio.populate('lists');

答案 2 :(得分:3)

实际答案:

使用此

populate('lists.list')

其他:

这里的列表是对象数组(列表)。 在JS中,您可以这样访问

console.log(lists.list);

和MongoDB语法与JS语法相似,为99%。 因此您也可以使用lists.list对此进行填充。

答案 3 :(得分:1)

  // Cart schema  

 var CartSchema = new mongooseSchema({
        productDetails: [
            {
                productId: {
                    type: mongoose.Schema.ObjectId,
                    required: true,
                    ref:'Product'

                },
                productCount: Number,
            }
        ],
        UserId: {
            type: String,
            default: '',
            required: true,
            trim: true,
        },
        shopId: {
            type: String,
            default: '',
            required: true,
            trim: true,
        },
    });

  // add this .populate('productDetails.productId').

         db.Cart.find({
                        UserId: userId,
                        shopId: shopId
                    }).populate('productDetails.productId').skip(pagination.skip).limit(pagination.limit).exec(function (error, CartList) {

                        if (error) {
                            callback(error, null)
                        } else {
                            callback(null, CartList)
                        }
                    });

答案 4 :(得分:1)

当嵌套排列我的架构时,填充在我的情况下不起作用

const chatSchema = mongoose.Schema({
    chats: [
    {
     type: Schema.Types.ObjectId,
     ref: "ChatMsg" },
   ],
  })

我是怎么解决的

Chat.findOne(
 { customer: req.body.customer, agency: req.body.agency },
  (err, chat) => {
   if (err) {
    res.status(422).send("Our fault");
   }
    chat.populate("chats").execPopulate(() => {
    res.send(chat);
   });
  }
);

答案 5 :(得分:0)

如果你有嵌套架构

YourSchema.find()
   .populate({
        path: 'map_data',
        populate: {
            path: 'location' 
        }
})

这对我有用