mongoose.populate() 未显示填充内容

Posted

技术标签:

【中文标题】mongoose.populate() 未显示填充内容【英文标题】:mongoose.populate() is not showing populate content 【发布时间】:2021-02-17 21:22:49 【问题描述】:

//我的用户架构

const mongoose = require('mongoose');

const ChatRoom = 要求('./chatRoom');

const userSchema = new mongoose.Schema(

_id: mongoose.Schema.Types.ObjectId,
username:
    type: 'String',
    unique: true,
,
collegeEmail:
    type: String,
    unique: true,
,
password: String,
photo: String,
name: String,
phoneNo: Number,
collegeName: String,
gender: String,
chatList:[userId:this, chatId:type: mongoose.Schema.Types.ObjectId, ref: 'ChatRoom'],
bio: String,
follow:[ this],
following:[ this],
lastSeen: Number,
active: Boolean, 
status: Boolean,
otp: Number

);

const User = mongoose.models.User || mongoose.model('用户', userSchema); module.exports = 用户;

//chatRoom 架构

const mongoose = require('mongoose');

const User = require('./user');

//msg 架构

const chatMsgSchema = new mongoose.Schema(

_id: mongoose.Schema.Types.ObjectId,
sender:  type: mongoose.Schema.Types.ObjectId, ref: 'User' ,
receiver:  type: mongoose.Schema.Types.ObjectId, ref: 'User' ,
msg: String,
time: Number

);

const ChatMsg = mongoose.models.ChatMsg || mongoose.model('ChatMsg', chatMsgSchema);

//chatTable 架构

const chatTableSchema = new mongoose.Schema(

_id: mongoose.Schema.Types.ObjectId,
chats:[type: mongoose.Schema.Types.ObjectId, ref: 'ChatMsg'],

);

const ChatRoom = mongoose.models.ChatRoom || mongoose.model('ChatRoom', chatTableSchema);

module.exports = ChatRoom, ChatMsg;

// 我用于填充聊天列表的脚本

router.post('/room',ensureAuthenticated,async function(req, res)

const id = req.body.id;
console.log(id);
const frnd = await User.
    findOne(username: req.user.username).
    populate(
        path: 'chatList',
        model: 'ChatRoom',
        match:  _id: id
    ).
    exec();
    console.log(frnd);

);

在控制台上显示所有聊天列表 =>

我对 chatList 应用的这些工作既没有填充也没有过滤

【问题讨论】:

【参考方案1】:
    欢迎使用 Stack Overflow 向 SO 提交问题时,请格式化您的问题,以便代码和消息之间有明显的区别。

尝试为您提供答案:您的代码存在很多问题。

你不应该在你的架构中定义_id,除非你有更具体的问题。

更简洁的代码是:

// my user schema

import mongoose,  Schema  from 'mongoose';

const userSchema = new Schema(
  username: 
    type: String,
    unique: true,
  ,
  collegeEmail: 
    type: String,
    unique: true,
  ,
  password:  type: String ,
  photo:  type: String ,
  name:  type: String ,
  phoneNo:  type: Number ,
  collegeName:  type: String ,
  gender:  type: String ,
  follow: [type: mongoose.Schema.Types.ObjectId, ref: 'User'],
  following: [type: mongoose.Schema.Types.ObjectId, ref: 'User'],
  chatList: [userId:type: mongoose.Schema.Types.ObjectId, ref: 'User', chatId:type: mongoose.Schema.Types.ObjectId, ref: 'ChatRoom'],
  bio:  type: String ,
  lastSeen:  type: Number ,
  active:  type: Boolean ,
  status:  type: Boolean ,
  otp:  type: Number ,
);

const User = mongoose.model('User', userSchema);
module.exports = User;

//msg schema

const chatMsgSchema = new Schema(
  sender:  type: Schema.Types.ObjectId, ref: 'User' ,
  receiver:  type: Schema.Types.ObjectId, ref: 'User' ,
  msg:  type: String ,
  time:  type: Number ,
);

const ChatMsg = mongoose.model('ChatMsg', chatMsgSchema);

//chatTable schema

const chatTableSchema = new Schema(
  chats: [ type: Schema.Types.ObjectId, ref: 'ChatMsg' ],
);

const ChatRoom = mongoose.model('ChatRoom', chatTableSchema);

module.exports =  ChatRoom, ChatMsg ;

// my script for populate chatList

router.post('/room', ensureAuthenticated, async function(req, res) 
  const id = req.body.id;
  console.log(id);
  const frnd = await User.findOne( username: req.user.username )
    .populate('chatList')
    .exec();
  console.log(frnd);
);

编辑

您填充数据的方式有点不对劲 应该是:

router.post('/room', ensureAuthenticated, async function(req, res) 
  const id = req.body.id;
  console.log(id);
  const frnd = await User.findOne( username: req.user.username )
    .populate(
       path : 'chatList.chatId', 
       model : 'ChatRoom'
    )
    .populate(
       path : 'chatList.userId', 
       model : 'User'
    )
    .exec();
  console.log(frnd);
);

您可能需要调整样本。

【讨论】:

兄弟实际上我需要chatList中的userId,那么我该如何存储它。 首先,userid 不等于this。其次,这不能在模式定义中设置。第二:由于您从用户那里获取聊天列表,因此您已经有了 UserId。我将编辑我的答案,为您提供一个简单的示例。 this => 类型:mongoose.Schema..Type.ObjectId. 像关注和关注数组我使用了这个关键字,它正在工作。并且在 userId 中,我没有存储我自己的 id。这样,我想与之聊天的用户的 id 将受到保护。 好的,我现在更了解你的想法了。我从未在架构定义中使用 this 关键字,我习惯于使用模型和对象 ID 进行引用。我将编辑我的答案以严格回答您的问题。

以上是关于mongoose.populate() 未显示填充内容的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose .populate 未在 JSON 中显示

Mongoose .populate() 不填充

Mongoose .populate 随机

Mongoose Populate Child ref 返回空数组

Mongoose Populate 返回 null 或 undefined

猫鼬'populate()'没有填充