mongodb 为什么我的mongoose populate没有检索嵌套数组?

46qrfjad  于 2023-06-05  发布在  Go
关注(0)|答案(1)|浏览(141)

我有以下mongoose模式:

const CategoriesSchema = new mongoose.Schema(
  {
sites: [
  {
    site: {
    type: ObjectId,
    ref: "Sites",
    }
  }
],
);

mongoose.model("Categories", CategoriesSchema, 'organizer-categories');

并且:

const SitesSchema = new Schema({
url: {
    type: String,
    required: true,
  },
  img: {
    type: String,
  },

});
mongoose.model("Sites", SitesSchema, "organizer-sites");,

下面的函数应该在mongodb中创建一个新站点,将站点添加到模式中所示的Categories中,并使用mongoose的populate方法返回更新的类别和新站点数据。但是只有站点的_id与类别数据一起返回。

exports.addSite = async (req, res) => {
const {categoryId, siteUrl} = req.body;
console.log('categoryId, siteUrl', categoryId, siteUrl)

try {

    let  site = await Sites.findOne({url: siteUrl});

    console.log('site', site)

    if(site) {
        return res.status(422).send(`${siteUrl} already exists.`)
    }

     site = await Sites.create({url: siteUrl, categoryId});
    //  site = {url: siteUrl, categoryId};

     const category = await Categories.findOneAndUpdate({
        _id: categoryId
    }, {
        $addToSet: {
            sites: site
        }
    }, {
        new: true
    }).populate({
        path: 'sites.site',
        model: 'Sites'
    })

 
   console.log('category', category)
    res.status(201).json(category);
} catch(error) {
    console.error(error);
    return res.status(500).send('Error adding category.')    
}

}

piv4azn7

piv4azn71#

  • “ Mongoose ”:“^7.2.1”*

架构中的sites字段包含不正确的引用数组。如果一个类别文档引用了一个站点文档数组,请按以下方式执行:

const CategoriesSchema = new mongoose.Schema({
  sites: [{ type: mongoose.Schema.Types.ObjectId, ref: "Sites" }],
});

请参见填充
一个工作示例:

import mongoose from "mongoose";
import util from 'util';
import { config } from '../../config';

mongoose.set('debug', true);

const CategoriesSchema = new mongoose.Schema({
  sites: [{ type: mongoose.Schema.Types.ObjectId, ref: "Sites" }],
});

const Categories = mongoose.model("Categories", CategoriesSchema, 'organizer-categories');
const SitesSchema = new mongoose.Schema({
  url: String
});
const Sites = mongoose.model("Sites", SitesSchema, "organizer-sites");

(async function main() {
  try {
    await mongoose.connect(config.MONGODB_URI);
    // seed
    const categoryDoc = await Categories.create({})
    const site = await Sites.create({ url: 'http://google.com' })

    const category = await Categories.findOneAndUpdate(
      { _id: categoryDoc._id },
      { $addToSet: { sites: site } },
      { new: true })
      .populate('sites')

    console.log('category: ', util.inspect(category, false, null))

  } catch (error) {
    console.error(error);
  } finally {
    await Promise.all(['organizer-categories', 'organizer-sites'].map(c => mongoose.connection.dropCollection(c)))
    await mongoose.connection.close()
  }
})();

日志:

category:  {
  _id: new ObjectId("64789a6b3ffd33b38a6eaf9a"),
  sites: [
    {
      _id: new ObjectId("64789a6b3ffd33b38a6eaf9c"),
      url: 'http://google.com',
      __v: 0
    }
  ],
  __v: 0
}

相关问题