【问题标题】:Mongoose Nested Populate Not Working猫鼬嵌套填充不起作用
【发布时间】:2017-08-08 21:10:42
【问题描述】:

所以我目前对猫鼬的繁殖感到非常困惑。

我的数据结构如下:用户有一个客户数组,一个客户有一个贷款数组。我正在使用 User.find 并填充客户端,没问题。但是,我如何填充客户内部的贷款?我试过这个:

基本上,目标是传入一组客户,每个客户将包含一笔贷款。但是现在,我希望那个贷款对象是空的。客户端被正确填充,但是,贷款引用被传递为未定义。

app.get("/loans", IsLoggedIn, function(req, res) {
  User.findById(req.user._id).populate({path: "clients", populate: { path: "loans", model: "loan"}}).exec(function(err, user){
    if(err){
      console.log(err);
    } else{
        var amountRepaid = calcRepaid(user.clients.loans);
        console.log(user.clients.loans);
        res.render("index", {clients: user.clients, amountRepaid: amountRepaid});
    }
  });

但它似乎不起作用,下面列出了我的模型,感谢任何帮助!

型号:

客户:

var mongoose = require("mongoose");
var clientSchema = mongoose.Schema({
  loans: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "loan"
  }],
  emailAdderess: String,
  firstname: String,
  lastname: String,
  contactNumber: String ,
  dateCreated: {type: Date, default: Date.now},
  gender: String,
})

module.exports = mongoose.model("Client", clientSchema);

用户:

const mongoose = require("mongoose");
const passportLocalMongoose = require("passport-local-mongoose");
var UserSchema = mongoose.Schema({
  username: String,
  password: String,
  firstname: String,
  lastname: String,
  clients: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "Client"
  }]
});
UserSchema.plugin(passportLocalMongoose);

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

贷款:

var mongoose = require("mongoose");

var LoanSchema = mongoose.Schema({
  firstName: String,
  lastName: String,
  email: String,
  contactNumber: Number,
  amountBorrowed: Number,
  length: String,
  address: String,
  dateDue: Date,
  gender: String,
  date: { type: Date, default: Date.now },
  amountRepaid: { type: Number, default: 0},
  loanRepaid: {type: Boolean, default: false}

})

module.exports = mongoose.model("loan", LoanSchema);

【问题讨论】:

  • 在这里提问时,请不要使用外部链接或代码图片,并在问题中包含相关代码。它还有助于使示例可重现,在这种情况下,这意味着包括应该产生预期结果的相关数据的“子集”。见How to create a Minimal, Complete, and Verifiable example。您可能的原因是模型之间的引用实际上不匹配。这是您应该查看的内容,如果您无法解决,请提供足够的数据以返回至少一个结果。
  • 你使用的猫鼬版本是什么?
  • @NeilLunn 抱歉,在我尝试修复了几个小时后,我在睡觉前发布了这个,我的错。我没有包含数据子集的原因是因为我没有使用一个。我想在开始时传入一个空数组,用户稍后会添加到它。我将把它添加到问题中。当您说模型之间的引用不匹配时,我不明白您的意思?你能不能扩大一点?谢谢。
  • @ryder 我使用的是 4.11.5 版
  • @Cathal 你有没有想过这个问题?我遇到了完全相同的问题。

标签: node.js mongodb mongoose


【解决方案1】:

试试这个:

.populate({
    path: 'clients',
    populate: {
        path: 'clients.loans'
    }
})

【讨论】:

  • 这似乎使事情正常,因为客户没有被填充,这意味着贷款也没有被填充
  • 嗯,很奇怪,我曾经这样做过,它对我有用...尝试删除嵌套填充中的模型部分?我认为没有必要。
  • 我真的尝试了大约 8 种不同的填充方法语法,但似乎都没有,我不知道为什么。是的,我尝试删除该模型,但它也不起作用,尝试将第二个填充为“clients.loans”并且只是“Loans”,但这也不起作用。
  • 哦,我明白了问题所在。您正在尝试访问 'user.clients.loans' 但 user.clients 是一个数组,因此正确的方法是 'user.clients[i].loans'
  • 好吧,听起来很有希望!我将尝试这个并创建一些示例数据,看看它是否有效,谢谢!我会回来告诉你的
猜你喜欢
  • 2015-10-06
  • 2014-12-19
  • 2015-02-09
  • 2013-06-20
  • 1970-01-01
  • 2014-07-28
  • 2021-11-07
  • 2016-12-24
  • 2014-05-01
相关资源
最近更新 更多