尝试加入两个文档时无法填充 Mongoose 中的路径

问题描述 投票:0回答:3

MongooseError:无法填充路径
loaned_to
,因为它不在您的架构中。将
strictPopulate
选项设置为 false 以覆盖。

我尝试在nodejs中使用mongoose连接mongodb中的两个文档,但不幸的是出现了这个错误。我的猫鼬版本是6.0.6

图书架构

const mongoose = require('mongoose');

const BookSchema = new mongoose.Schema({
    "name": {type: String, required: true},
    "author_name": {type: String, required: true},
    "published_date": {type: Date, required: false},
    "copies": [
        {
            "isbn_number": {type: String, required: true},
            "status": {type: String, required: true, default: "Available"},
            "due_back": {type: Date, required: false},
            "loaned_to": {type: mongoose.Schema.Types.ObjectId, required: false, ref: "User"}
        },
    ]
})

const Book = mongoose.model("Book", BookSchema);
module.exports = Book;

用户架构

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
    "first_name": {type: String, required: true},
    "last_name": {type: String, required: true},
    "phone_number": {type:  String, required: true},
    "address": {type:  String, required: false},
    "user_name":{type: String, required: true},
    "password": {type:  String, required: true},
    "email": {type:  String, required: true},
    "notifications": [
        {
            "notification_id" : {type:"string", required:true},
            "notification": {type: "string", required: true}
        },
    ]
})

const User = mongoose.model("User", UserSchema);
module.exports = User;

我的加入文档的代码

exports.getAllBooks = async (req, res) => {
    try {
        let data = await BookModel.findOne().populate("loaned_to");
        res.status(200).send({data: [...data], success: true})
    } catch (err) {
        console.log(err)
        res.status(404).send({success: false, msg: err.message})
    }
}
node.js mongodb mongoose mern
3个回答
22
投票
exports.getAllBooks = async (req, res) => {
  try {
    let data = await BookModel.findOne().populate({
      path: 'copies.loaned_to',
      select:
        'first_name lastName phone_number address user_name email notifications',
    });
    res.status(200).json({ data: [...data], success: true });
  } catch (err) {
    console.log(err);
    res.status(500).json({ success: false, msg: err.message });
  }
};

2
投票

使用嵌套填充,如下例所示(该示例假设 Token 模型有一个用户,该用户又具有一个角色,并且一个角色具有权限)。 这将返回与过滤后的令牌关联的用户对象,以及分配给用户的角色以及分配给该角色的权限。

即:TokenModel(与)有关系 -> UserModel(与)有关系 -> RoleModel(与)有关系 -> PermissionsModel)

const popObj = {
        path: 'user',
        options: { sort: { position: -1 } },
        populate: {
          path: 'role',
          select: 'name',
          populate: {
            path: 'permissions'
          }
        }
};
const tokenFilter = {is_active: true};
TokenModel.find(userFilter).populate(popObj);

0
投票
Just add {
    strictPopulate: false
}  to the BookSchema  

const mongoose = require('mongoose');

const BookSchema = new mongoose.Schema({
    "name": {type: String, required: true},
    "author_name": {type: String, required: true},
    "published_date": {type: Date, required: false},
    "copies": [
        {
            "isbn_number": {type: String, required: true},
            "status": {type: String, required: true, default: "Available"},
            "due_back": {type: Date, required: false},
            "loaned_to": {type: mongoose.Schema.Types.ObjectId, required: false, ref: "User"}
        },
    ]
},{
    strictPopulate: false
} )

const Book = mongoose.model("Book", BookSchema);
module.exports = Book;
© www.soinside.com 2019 - 2024. All rights reserved.