【问题标题】:Select field populated in Mongoose选择在 Mongoose 中填充的字段
【发布时间】:2020-07-23 06:29:27
【问题描述】:

我需要过滤获得的结果字段,以使用 mongoose select() 函数填充。我只需要Post 对象的titlecontentimage 字段以及User 对象的nameavatar

在 User 架构中,我创建了一个 virtual,它引用 Post 架构的 userId 字段。

// ========= MODELS =============

const mongoose = require('mongoose');

const { Schema } = mongoose;

const userSchema = new Schema({
    name: { type: String, trim: true, required: true },
    email: { type: String, trim: true, required: true },
    password: { type: String, trim: true, required: true },
    description: { type: String, trim: true, required: true },
    avatar: { type: String, trim: true, required: true },
});

userSchema.virtual('ownerPost', {
  ref: 'Post',
  localField: '_id',
  foreignField: 'userId',
});

const postSchema = new Schema(
  {
    title: { type: String, trim: true, lowercase: true, required: true },
    content: { type: String, required: true },
    summary: {type: String, required: true },
    image: { type: String, trim: true, required: true },
    userId: { type: Schema.Types.ObjectId, ref: 'User', required: true }
  });

const Post = mongoose.model('Post', postSchema);
const User = mongoose.model('User', userSchema);

// ========= CONTROLLERS =============

const getPostById = async (req, res, next) => {
  try {
    const { id } = req.params;
    const post = await Post.findById(id)
      .populate('userId')
      // it doesn't work
      // .select(['title', 'content', 'image', 'userId.name', 'userId.avatar']);
      // it doesn't work
      // .select(['title', 'content', 'image', 'name', 'avatar']);

    return res.status(200).json(post);
  } catch (error) {
    return next(error);
  }
};

// ========= RESPONSE WITHOUT SELECT IN GET POST BY ID =============

{
    "title": "Example Title",
    "content": "<h1>This is content</h1>",
    "summary": "<h4>This is summary</h4>",
    "image": "https://upload.wikimedia.org/wikipedia/commons/0/02/Great_Wave_off_Kanagawa_-_reversed.png",
    "userId": {
        "name": "peter",
        "email": "peter80@gmail.com",
        "password": "$2b$12$LaJWX1/A3ATq4c/tgNIs.uwhnpZGwsqBePFLxIFCDa9gwjitcalda",
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.",
        "avatar": "https://pngimage.net/wp-content/uploads/2018/05/avatar-profile-png-2.png",
        "id": "5e9066e5bc3e6a415134396e"
    },
    "id": "5e90677cbc3e6a4151343970"
}

// ========= RESPONSE WITH SELECT IN GET POST BY ID =============

{
    "title": "titulo de ejemplo",
    "content": "<h1>Esto es un contenido de ejemplo</h1>",
    "image": "https://upload.wikimedia.org/wikipedia/commons/0/02/Great_Wave_off_Kanagawa_-_reversed.png",
    "userId": {
        "name": "peter",
        "email": "peter80@gmail.com",
        "password": "$2b$12$LaJWX1/A3ATq4c/tgNIs.uwhnpZGwsqBePFLxIFCDa9gwjitcalda",
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.",
        "avatar": "https://pngimage.net/wp-content/uploads/2018/05/avatar-profile-png-2.png",
        "id": "5e9066e5bc3e6a415134396e"
    },
    "id": "5e90677cbc3e6a4151343970"
}

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query mongoose-populate


    【解决方案1】:

    您可以遵循此准则

    const post = await Post.findById(id)
          .select("+title +content +image")
          .populate('userId')
    
    
    **Also You can use Aggregate: $project operator**
    

    【讨论】:

      【解决方案2】:

      你可以使用select方法从当前集合中选择你需要的东西

      关于填充字段,您可以将对象传递给填充方法以指示您将填充的路径,并从该集合中选择哪些项目

      你的查询应该是这样的

      Post.findById(id).select('title content image userId').populate({ path: 'userId', select: 'name avatar' })
      

      注意我们需要在第一次select中选择userId,所以我们可以在populate函数中使用

      【讨论】:

        猜你喜欢
        • 2012-01-22
        • 2017-05-21
        • 1970-01-01
        • 2013-07-06
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 2017-05-15
        相关资源
        最近更新 更多