简体   繁体   中英

Mongoose One-to-Many, How to get field value of category

I have 2 collection: Category and book

Book:

      const mongoose = require('mongoose');
        // eslint-disable-next-line camelcase
        const mongoose_delete = require('mongoose-delete');
        
        const { Schema } = mongoose;
        const SchemaTypes = mongoose.Schema.Types;
        const Book = new Schema({
          name: { type: String },
          price: { type: Number },
          images: { type: Array },
          country: { type: String },
          author: { type: String },
          publicationDate: { type: String },
          description: { type: String },
          category: { type: SchemaTypes.ObjectId, ref: 'Category' },
          date: { type: Date, default: Date.now },
        }, {
          timestamps: true,
        });
        Book.plugin(mongoose_delete);
        Book.plugin(mongoose_delete, { overrideMethods: 'all', deletedAt: true });
        module.exports = mongoose.model('Book', Book);

Category:

      const mongoose = require('mongoose');
        // eslint-disable-next-line camelcase
        const mongoose_delete = require('mongoose-delete');
        
        const SchemaTypes = mongoose.Schema.Types;
        const { Schema } = mongoose;
        
        const Category = new Schema({
          name: { type: String, required: true },
          image: { type: String },
          products: [{ type: SchemaTypes.ObjectId, ref: 'Book' }],
          date: { type: Date, default: Date.now },
        }, {
          timestamps: true,
        });
        Category.plugin(mongoose_delete);
        Category.plugin(mongoose_delete, { overrideMethods: 'all', deletedAt: true });
        module.exports = mongoose.model('Category', Category);

and I select all the books received on the list:

      {
        _id: new ObjectId("623668ac5b1d392b37690cbc"),
        name: 'The Godfather',
        price: 110000,
       
        country: 'U.S',
        publicationDate: '1969',
        category: new ObjectId("6238fdf64f60303756b60b20"),
        author: 'Mario Puzo',
        ... : ...

}

And I want to display the category name on the product list, how do I do it? **like: {{book.category.name}}

{{book.category.image}}

?**

Since you are using Mongoose, you can use populate() method. You can do it like this:

const books = await Books.find().populate('category')

try $lookup (aggregation)

Book.aggregate([{
    $lookup: {
        from: "Category", 
        localField: "category",
        foreignField: "_id",
        as: "category"
    }
}]).exec(function(err, students) {
   
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM