Коллекция, ссылающаяся на несколько коллекций

#mongodb

#mongodb

Вопрос:

Я хочу иметь коллекцию с несколькими полями, ссылающимися на несколько коллекций, что-то вроде этого:

 var comboSchema = new Schema({
  oneId: { type: Schema.Types.ObjectId, ref: "One" },
  twoId: { type: Schema.Types.ObjectId, ref: "Two" },
  threeId: { type: Schema.Types.ObjectId, ref: "Three" },
  components: {
    id: {type: Schema.Types.ObjectId, ref: "Component"},
    amount: {type: Number}
  }
}  
  

Я знаю, что могу использовать $lookup и aggregate для получения данных, но похоже, что это работает только с одним полем в коллекции?

Любая помощь? Спасибо! 🙂

Комментарии:

1. Действительно не уверен, в чем здесь вопрос. Похоже, у вас есть встроенный ответ, в котором вы ожидаете, что кто-то согласится с вами. Вместо этого вы могли бы рассмотреть возможность объяснения того, чего вам нужно достичь, если вам нужен совет о том, как структурировать данные.

2. @NeilLunn Вопрос в следующем: как бы вы получили данные из такой коллекции?

Ответ №1:

Это образец модели с использованием ref, ключ ref в объекте будет принимать имя модели, на которую вы ссылаетесь

 const mongoose = require('mongoose');
const postSchema = mongoose.Schema({
    text: {
        type: String,
        required: 1
    },
    mediatype: {
        type: String,
        required: 1
    },
    media: {
        type: String,
        required: true
    },
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'user'
    },
    likes: {
        type: [{
            userid: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'user'
            }
        }]
    },
    comments: {
        type: [{
            userid: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'user'
            },
            comment: String
        }]
    },
}, {
    timestamps: true
})

const Post = mongoose.model('post', postSchema)

module.exports = Post
  

затем вы можете заполнить ее следующим образом Post.find().populate('user')