Mongoose 填充包含 ref 的对象数组

Posted

技术标签:

【中文标题】Mongoose 填充包含 ref 的对象数组【英文标题】:Mongoose populate with array of objects containing ref 【发布时间】:2013-05-14 12:29:39 【问题描述】:

我有一个 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);

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨,朋友,我想念的任何东西都不适合我。我还没有使用必需的。 它对我有用。我正在为服务数组中的每个服务填充谢谢。 services:[ quantity: Number, service: type:Schema.Types.ObjectId, ref: 'vas' ], 谢谢,它的工作,你真的拯救了我的一天。【参考方案2】:
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');

【讨论】:

如何在此处填写 adminId? adminInfo: _id: false, adminId: [ type: Schema.Types.ObjectId, ref: 'User' ] XYZ.populate('adminInfo.adminId'); 已经试过了请看这里:***.com/questions/62531177/… 第一个有效,但第二个无效。知道为什么吗?【参考方案3】:

实际答案:

使用这个,

populate('lists.list')

额外:

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

console.log(lists.list);

MongoDB 语法与 JS 语法有 99% 的相似性。 所以…………

【讨论】:

如何在此处填写 adminId? adminInfo: _id: false, adminId: [ type: Schema.Types.ObjectId, ref: 'User' ] 【参考方案4】:

如果您有嵌套架构

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

对我有用

【讨论】:

【参考方案5】:
  // 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)
                        
                    );

【讨论】:

【参考方案6】:

在我的 Schema 嵌套数组时,填充在我的情况下不起作用

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);
   );
  
);

【讨论】:

以上是关于Mongoose 填充包含 ref 的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongoose 中填充包含 ref 的数组数组

如何在 Mongoose 中搜索填充数组 [包含 ref 的数组]

Mongoose:在数组中填充对象的问题

Mongoose 切片数组,在填充字段中

在数组中填充对象

Mongoose 深度填充多个 2 级对象不起作用