【问题标题】:mongooseJS can not populate order with itemsmongooseJS 无法用项目填充订单
【发布时间】:2015-11-09 23:27:26
【问题描述】:

我正在尝试让猫鼬填充工作。

我有两种型号,一种用于订单,另一种用于订购商品。

我这样做纯粹是为了理解填充。

我确实有两个文件,但我现在将所有内容都放在一个名为 main.js 的文件中

main.js 在项目模型中创建 3 个项目。

然后我尝试使用 3 件商品填充订单模型。

查询的输出现在给出正确的填充结果。

也就是说从行输出

console.log(JSON.stringify(orders, null, "\t");

现在:

[ { "_id": "55d32e4594db780b1bbb4372", “__v”:0, “行”:[ { “价格”:2.4, “数量”:5, "_id": "55d32e4594db780b1bbb436f", “__v”:0 }, { “价格”:3.7, “数量”:7, "_id": "55d32e4594db780b1bbb4370", “__v”:0 }, { “价格”:1.2, “数量”:3, "_id": "55d32e4594db780b1bbb4371", “__v”:0 } ] } ]

但是数据库没有填充。

下面是main.js文件

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/mydb');

var Schema = mongoose.Schema;

var OrderSchema = new Schema({
  lines: [{type: mongoose.Schema.Types.ObjectId, ref: 'Item'}]
});

var ItemSchema = new Schema({
  price: Number,
  quantity: Number
});

var Order = mongoose.model('Order', OrderSchema);
var Item = mongoose.model('Item', ItemSchema);

var itemArray = [
  {price: 2.4, quantity: 5},
  {price: 3.7, quantity: 7},
  {price: 1.2, quantity: 3}
];

Item.create(itemArray, function(err) {
  if (err) {
    console.log('Error creating items: ', err);
  }

  var order = new Order();
    Item.find({}, {_id: 1}, function(err, result) {
        result.forEach(function(obj) {
                order.lines.push(obj._id);
        });
    }).exec().then(function() {
        order.save(function(err) {
            if (!err) {
                Order.find({})
                    .populate('lines')
                    .exec(function(err, orders) {
                        console.log(JSON.stringify(orders, null, "\t")); // output is populated the database is still not populating.

                    });
            }
        });
}    );
});

【问题讨论】:

  • 所以您确实意识到您需要先将商品添加到订单中? .populate() 调用只是将已附加的项目数据作为第一类对象而不是引用拉入。您似乎期望它会以某种方式“神奇地”添加项目。
  • 感谢您的回复,布雷克七号您能否更详细地解释一下如何获取我在 main.js 中使用 Item.create 创建的 3 个项目来填充我在 populate.js 中创建的订单跨度>
  • 不知道我对此能说得有多清楚。 populate() 不会向您的对象添加项目。 mongoose 文档中有非常清晰的示例。
  • 感谢您回复我布雷克七。我遇到了一个例子,我在“alexanderzeitler.com/articles/…”找到了作品。我现在也像我期望的那样工作,作为行 console.log(JSON.stringify(orders, null, "\t")) 的输出
  • 数据库仍未更新。 Blakes Seven 如果你知道如何修复我的程序,能否请你展示一些代码来证明你在说什么。

标签: node.js mongodb mongoose


【解决方案1】:

populate 方法的用途似乎有些混乱。基本上填充是猫鼬的“加入”版本。它允许查询(或文档)自动检索和“加入”任何相关文档并返回修改后的文档。对于要填充的文档中的每个引用值,populate 方法将执行单独的查询以获取那些关联的文档(通常这是通过 ID 但可以是自定义查询),然后在内存中它会用检索到的文档替换引用。

它确实不会改变集合中的文档,因为这纯粹是一个获取操作。

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2017-10-08
    • 2015-01-20
    • 1970-01-01
    • 2013-12-01
    • 2015-10-23
    • 2018-03-05
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多