84

我有一个 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"
    }
  ]

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

4

6 回答 6

148

我找到了答案:populate('lists.list')有效。感谢这个问题:Mongoose 在一个对象中填充?

于 2013-05-20T01:07:33.883 回答
6
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');

于 2020-05-05T17:19:51.597 回答
4

实际答案:

用这个,

populate('lists.list')

额外的:

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

console.log(lists.list);

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

于 2020-05-06T20:32:47.940 回答
2

如果您有嵌套架构

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

这对我有用

于 2021-05-17T11:18:27.283 回答
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)
                        }
                    });
于 2020-03-21T17:28:16.900 回答
1

嵌套到数组时,填充在我的情况下不起作用,我的 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);
   });
  }
);
于 2021-03-18T18:04:08.417 回答