// backend\models\Playlist.js
const mongoose = require('mongoose');
const playlistSchema = new mongoose.Schema({
name: { type: String, required: true },
videos: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Video' }],
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
});
module.exports = mongoose.model('Playlist', playlistSchema);
// backend\models\Video.js
const mongoose = require('mongoose');
const commentSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
username: { type: String, required: true },
comment: { type: String, required: true },
date: { type: Date, default: Date.now },
});
const videoSchema = new mongoose.Schema({
title: String,
description: String,
url: String,
uploadDate: {
type: Date,
default: Date.now,
},
uploader: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
likes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
comments: [commentSchema],
cloudinary_id: { type: String, required: true },
});
module.exports = mongoose.model('Video', videoSchema);
// backend\models\User.js
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
userSchema.pre('save', async function (next) {
if (this.isModified('password')) {
this.password = await bcrypt.hash(this.password, 10);
}
next();
});
userSchema.methods.comparePassword = function (password) {
return bcrypt.compare(password, this.password);
};
module.exports = mongoose.model('User', userSchema);
Модальный список воспроизведения имеет ссылку на модальный видео, модальный видео имеет ссылку на пользовательский модальный, но я получаю только идентификатор видео, присутствующий в модальном плейлисте, а не весь видеодокумент.
Вот как я получаю доступ с помощью API:
router.get('/playlist/:id/videos', authMiddleware, async (req, res) => {
try {
const playlist = await Playlist.findById(req.params.id)
.populate({
path: 'videos',
populate: { path: 'uploader' }
});
if (playlist.userId.toString() !== req.userData.userId) {
return res.status(403).json({ message: 'Forbidden' });
}
res.json(playlist.videos);
} catch (err) {
res.status(500).json({ message: err.message });
}
});
Я попытался заметить, что я реализовал функцию заполнения в других API, и она работает нормально, но не здесь.
Предоставлены соответствующие ключи для видеодокумента и документа списка воспроизведения в моей схеме.
Вы отредактировали вопрос до такой степени, что исходный вопрос и код исчезли. Я также думаю, что был запрошен реальный документ, а не ваша схема. Однако ваша схема важна, поэтому оставьте ее в вопросе. Теперь вам нужно отредактировать вопрос, включив в него исходный код, показывающий, как вы пытаетесь заполнить и добавить образец документа.
Извините за невнятность в моем ответе. Часть «Только соответствующие ключи» следовало бы уточнить как «фактические документы с соответствующими ключами и их значениями». Конечно, схема была бы полезна, поскольку вы теперь включили ее.
@jQueeny, My Bad, нужно было дважды проверить. Теперь я включил необходимые детали. Готов добавить любые другие важные для отладки выданного.
@WedothebestforYou, да, схема уже включена, кажется, где-то здесь кроется ошибка
Пожалуйста, смотрите код ниже. Здесь использовались те же три определения схемы. А затем создал тестовый плейлист. Код поиска тот же, что и в исходном вопросе. Посмотрите вывод: видеодокумент теперь заполнен.
Просьба обратить пристальное внимание на код в строке «настройка ссылки на видео». Это может быть потенциальная строка, которую нужно проверить на соответствие вашему коду. Как известно, эта строка задает ссылку на Видеодокумент, связь между документом списка воспроизведения и видеодокументом. Поскольку определения схемы и оператор find работают нормально, эта строка будет наиболее подходящей для рассмотрения.
Если окажется, что указанная выше строка также верна в вашем коде, повторите тест с новым набором документов — создайте нового пользователя, новый видеодокумент для нового пользователя и новый список воспроизведения для нового видео.
// MongoDB: 7.0.2
// Mongoose : 8.3.2
// Node.js v21.6.0.
// populateissue.mjs
import mongoose, { Schema } from 'mongoose';
main().catch((err) => {
console.info(err);
});
async function main() {
await mongoose.connect('mongodb://127.0.0.1:27017/myapp');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
const Usermodel = mongoose.model('User', userSchema);
await Usermodel.deleteMany();
const commentSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
username: { type: String, required: true },
comment: { type: String, required: true },
date: { type: Date, default: Date.now },
});
const videoSchema = new mongoose.Schema({
title: String,
description: String,
url: String,
uploadDate: {
type: Date,
default: Date.now,
},
uploader: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
likes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
comments: [commentSchema],
cloudinary_id: { type: String, required: true },
});
const Videomodel = mongoose.model('Video', videoSchema);
await Videomodel.deleteMany();
const playlistSchema = new mongoose.Schema({
name: { type: String, required: true },
videos: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Video' }],
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
});
const Playlistmodel = mongoose.model('Playlist', playlistSchema);
await Playlistmodel.deleteMany();
const userdoc = new Usermodel({
username: 'somename',
password: 'somepassword',
});
const videodoc = new Videomodel({
title: 'someTitle',
uploader: userdoc._id,
cloudinary_id: 'someId',
});
const playlistdoc = new Playlistmodel({
name: 'someName',
videos: videodoc._id, // setting video reference
userId: userdoc._id, // kept it the same as uploader since it is a test data
});
await userdoc.save();
await videodoc.save();
await playlistdoc.save();
const playlistdocs = await Playlistmodel.findById(playlistdoc._id).populate({
path: 'videos',
populate: { path: 'uploader' },
});
console.info(playlistdocs);
console.info(playlistdocs.videos);
}
// output
{
_id: new ObjectId('6629c3f3450ae04736c1877e'),
name: 'someName',
videos: [
{
_id: new ObjectId('6629c3f3450ae04736c1877d'),
title: 'someTitle',
uploader: [Object],
likes: [],
cloudinary_id: 'someId',
uploadDate: 2024-04-25T02:46:11.929Z,
comments: [],
__v: 0
}
],
userId: new ObjectId('6629c3f3450ae04736c1877c'),
__v: 0
}
[
{
_id: new ObjectId('6629c3f3450ae04736c1877d'),
title: 'someTitle',
uploader: {
_id: new ObjectId('6629c3f3450ae04736c1877c'),
username: 'somename',
password: 'somepassword',
__v: 0
},
likes: [],
cloudinary_id: 'someId',
uploadDate: 2024-04-25T02:46:11.929Z,
comments: [],
__v: 0
}
]
Спасибо за помощь. повторение теста с новым набором документов, как вы предложили, решило проблему. Незначительная проблема действительно может вызвать серьезные страдания.
Пожалуйста, покажите видеодокумент и документ списка воспроизведения — только соответствующие клавиши.