簡體   English   中英

mongoose如何加入收藏?

[英]How to join collection in mongoose?

我的問題是我想加入這個模式。 例如:在任何電子商務網站中都有一個主圖像,單擊該產品后,我們可以看到該產品的多個圖像 對於上傳圖像,我使用multer package 並且在 multer 中我們不能以相同的形式上傳單個圖像和圖像數組,所以我創建了一個只需要一組圖像的新表單。 所以我想用我的主表單加入那個圖像數據數組

此架構是上傳單個圖像:

const mongoose = require('mongoose');

const singleImageSchema = new mongoose.Schema({
   file: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'File',
   },
   singleImage: {
      type: String,
   },
});

module.exports = new mongoose.model('File', singleImageSchema);

這個架構是上傳多張圖片:

const mongoose = require('mongoose');

const multipleImageSchema = new mongoose.Schema({
   multipleImage: {
      type: [String],
   },
});

module.exports = new mongoose.model('Image', multipleImageSchema);
const express = require('express');
const bodyParser = require('body-parser');
const ejs = require('ejs');
const mongoose = require('mongoose');
const multer = require('multer');
const path = require('path');

const helpers = require('./helpers');
const singleImage = require('./models/singleImage');
const multipleImage = require('./models/multipleImage');

const storage = multer.diskStorage({
   destination: function (req, file, cb) {
      cb(null, './public/uploads');
   },

   // By default, multer removes file extensions so let's add them back
   filename: function (req, file, cb) {
      cb(
         null,
         file.fieldname + '-' + Date.now() + path.extname(file.originalname),
      );
   },
});

const app = express();

app.set('view engine', 'ejs');

app.use(
   bodyParser.urlencoded({
      extended: true,
   }),
);
app.use(express.static('public'));

//connect to database
mongoose.connect('mongodb://localhost:27017/ImageInDB', {
   useNewUrlParser: true,
   useUnifiedTopology: true,
});

const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {
   console.log('Database is connected successfully on port 27017!!!');
});

app.get('/', (req, res) => {
   res.render('file_upload');
});

app.post('/upload-profile-pic', (req, res) => {
   let upload = multer({
      storage: storage,
      fileFilter: helpers.imageFilter,
   }).single('profile_pic');

   upload(req, res, function (err) {

      if (req.fileValidationError) {
         return res.send(req.fileValidationError);
      } else if (!req.file) {
         return res.send('Please select an image to upload');
      } else if (err instanceof multer.MulterError) {
         return res.send(err);
      } else if (err) {
         return res.send(err);
      }
      const oneImage = new singleImage({
         singleImage: req.file.filename,
      });
      oneImage.save(err => console.log(err));

      // Display uploaded image for user validation
      singleImage.find({}, (err, product) => {
         res.render('preview', {
            product: product,
         });
      });
   });
});
app.post('/upload-multiple-images', (req, res) => {
   let upload = multer({
      storage: storage,
      fileFilter: helpers.imageFilter,
   }).array('multiple_images', 10);

   upload(req, res, function (err) {
      if (req.fileValidationError) {
         return res.send(req.fileValidationError);
      } else if (!req.files) {
         return res.send('Please select an image to upload');
      } else if (err instanceof multer.MulterError) {
         return res.send(err);
      } else if (err) {
         return res.send(err);
      } // The same as when uploading single images

      const files = req.files;

      const moreImage = new multipleImage({
         multipleImage: files.map(file => file.filename),
      });
      moreImage.save(err => console.log(err));
      // Loop through all the uploaded images and display them on frontend
      multipleImage.find({}, (err, products) => {
         res.render('multiPreview', {
            products: products,
         });
      });
   });
});

app.listen(3000, function () {
   console.log('Server started on port 3000');
});

您需要將參考架構添加到 singleImageSchema,然后使用 populate() 方法,如下所示:

    const singleImageSchema = new mongoose.Schema({
       file: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'File',
       },
       singleImage: {
          type: String,
       },
        multipleImage: [{ type: Schema.Types.ObjectId, ref: 'Image' }]
    });

那么您的查詢將變為

    singleImage
    .find()
    .populate('multipleImage')
    .exec(function(err, result) {

    });

populate() 方法的文檔: https://mongoosejs.com/docs/populate.html

相反,為什么您不添加單個表?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM