javascript - Mongoose - 填充数组类型嵌套对象时的 .populate 问题

标签 javascript node.js mongodb mongoose

我正在尝试填充对象 myObj。将值保存到“a”对象后,我可以在数据库中查看“myObj”的数据。但是当我查询 obj 'a' 时,它不会提取 'myObj' 数据。我的架构如下。

var a= new Schema({
    b: 'Date',
    c: {
        d: {
            type: Schema.ObjectId,
            ref: 'Student'
        },
        myObj: {
            type: [{
                type: Schema.ObjectId,
                ref: 'Exam'
            }],
            select: true
        },
    }
});

考试大纲

var ExamSchema= new Schema({
    name: String,        
    subject: {
        type: [{
            name: String, 
            marks: Number            
        }],
        select: false
    }
});

我的查询方法:

exports.a = function(req, res, next, id) {
    A //model of 'a'
        .findOne({
            _id: id
        })
        .populate('c.d c.myObj')
        .exec(function(err, aObj) {
            if (err) return next(err);
            if (!aObj) return next(new Error('Failed to load  ' + id));            
            req.a = aObj;
            next();
        });
};

预期输出:

var a = new Schema({
    b: "2014-07-10T02:30:00.005Z",
    ,
    c: {
        d: {
            name: 'Hari',
            age: 10
        },
        myObj: {
            [{
                name: 'Quaterly',
                subject: {
                    [{
                        name: 'English',
                        marks: 100
                    }, {
                        name: 'Maths',
                        marks: 90
                    }, {
                        name: 'Science',
                        marks: 100
                    }],
                    select: false
                }
            }, {
                name: 'Half-Yearly',
                subject: {
                    [{
                        name: 'English',
                        marks: 100
                    }, {
                        name: 'Maths',
                        marks: 90
                    }, {
                        name: 'Science',
                        marks: 100
                    }],
                    select: false
                }
            }],
            select: true
        },
    }
});

**Actual Output:**

    var a = new Schema({
        b: "2014-07-10T02:30:00.005Z",
        ,
        c: {
            d: {
                name: 'Hari',
                age: 10
            },
            myObj: []
        }
    });

请告诉我我哪里错了。谢谢。

最佳答案

这应该有效,这里有一个简化的示例,用于测试和比较,看看您实际上可能会做哪些不同的事情:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;


mongoose.connect('mongodb://localhost/throw');

var oneSchema = new Schema({
  name: String
});

var twoSchema = new Schema({
  name: String
});

var testSchema = new Schema({
  name: String,
  c: {
    d: { type: Schema.Types.ObjectId, ref: "One" },
    e: [{ type: Schema.Types.ObjectId, ref: "Two" }]
  }
});

var Test = mongoose.model( "Test", testSchema, "test" );
var One =  mongoose.model( "One", oneSchema, 'one' );
var Two =  mongoose.model( "Two", twoSchema, 'two' );


var test = new Test({ name: "test" });

var one = new One({ name: "one" });

var two = new Two({ name: "two" });
var three = new Two({ name: "three" });

test.c.d = one;
test.c.e.push(two,three);

async.series([

  // Remove prior
  function(callback) {
    async.each([Test,One,Two],function(model,complete) {
      model.remove(function(err) {
        if (err) throw err;
        complete();
      });
    },function(err) {
      if (err) throw err;
      callback();
    });
  },

  // Save new
  function(callback) {
    async.each([test,one,two,three],function(model,complete) {
      model.save(function(err) {
        if (err) throw err;
        complete();
      });
    },function(err) {
      if (err) throw err;
      callback();
    });
  },


  // Unpopulated
  function(callback) {
    Test.findOne()
      .exec(function(err,obj) {
        if (err) throw err;

        console.log( "Before: %s", JSON.stringify( obj, undefined, 4 ) );
        callback();
      });
  },

  // Populated

  function(callback) {
    Test.findOne()
      .populate("c.d c.e")
      .exec(function(err,obj) {
        if (err) throw err;

        console.log( "After: %s", JSON.stringify( obj, undefined, 4 ) );
        callback();
      });
  }

],function(err) {
  if (err) throw err;
  process.exit();
});

这应该产生如下结果:

Before: {
    "_id": "53be11986c64035664e4d73a",
    "name": "test",
    "__v": 0,
    "c": {
        "d": "53be11986c64035664e4d73b",
        "e": [
            "53be11986c64035664e4d73c",
            "53be11986c64035664e4d73d"
        ]
    }
}
After: {
    "_id": "53be11986c64035664e4d73a",
    "name": "test",
    "__v": 0,
    "c": {
        "d": {
            "_id": "53be11986c64035664e4d73b",
            "name": "one",
            "__v": 0
        },
        "e": [
            {
                "_id": "53be11986c64035664e4d73c",
                "name": "two",
                "__v": 0
            },
            {
                "_id": "53be11986c64035664e4d73d",
                "name": "three",
                "__v": 0
            }
        ]
    }
}

关于javascript - Mongoose - 填充数组类型嵌套对象时的 .populate 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666860/

相关文章:

javascript - 如何在禁用 JavaScript 的情况下加载具有特定滚动位置的页面以进行表单提交

node.js - 使用 NGINX 的 NodeJs 应用程序的 https 响应非常慢

javascript - 我如何在 PUG 模板引擎中显示对象?

javascript - node.js 像标准 javascript 一样检查 dom

mongodb - 在 MongoDB 查询中,负限制是什么意思?

javascript - 使用 JS 更改 CSS 值的最佳方法?

javascript - Javascript 中代码的执行顺序是什么?

javascript - 如何将第一个 promise 的返回值传递给链式 promise 中的最后一个 promise

node.js - MongoError : attempt to write outside buffer bounds

java - Java中最简单的事务框架是什么?