【问题标题】:Make or simulate a join in mongodb在 mongodb 中创建或模拟连接
【发布时间】:2014-10-29 04:05:42
【问题描述】:

我想在 mongodb 中使用 mongoose 模拟一个连接查询。没有嵌套数据,只有两个 Schema,其中 OrderSchema:_id 引用的是 DetailSchema:orderId

获取所有订单然后逐个查询它们的详细信息是一个糟糕的解决方案。我曾尝试在猫鼬中使用填充,但这只有在我更改方案时才有效,这是不是的可能性。我根本想不出一个干净的方法来做到这一点!

var OrderSchema = mongoose.Schema({
    _id: Number,
    customerId: String,
    employeeId: Number,
    orderDate: String,
    requiredDate: String,
    shippedDate: String,
    shipVia: String,
    freight: Number,
    shipName: 
});
exports.OrderModel = mongoose.model('orders', OrderSchema);

var DetailsSchema = mongoose.Schema({
    orderId: Number,
    productId: 
    quantity: Number,
    discount: Number
});

【问题讨论】:

  • 如果可以的话,我会更改架构,但是数据库已经创建并填充了数据。 Sp 我需要找到一种在不更改架构的情况下进行连接的方法。

标签: javascript node.js mongodb mongoose entity-relationship


【解决方案1】:

只需更改您的 DetailSchema 定义以将 orderId 定义为对 Order 的引用:

var DetailsSchema = mongoose.Schema({
    orderId: {type: Number, ref: 'Order'},
    productId: Number,
    quantity: Number,
    discount: Number
});

这不需要对现有文档中的实际数据进行任何更改,ref 只是 Mongoose 用于了解哪个模型的 _id 字段包含引用的元数据。

有了这些,您可以使用populate 来提取订单详细信息:

Details.find().populate('orderId').exec(function(err, details) { ... });

【讨论】:

  • 但这给我带来了另一个问题。如果 ref 指向 _id,我可以这样做,这样我就可以像名字或其他东西一样加入。并且是模式只是我希望我的数据如何显示的模型。谢谢你的回答:) 它就像一个魅力
  • 很高兴它有帮助!最好将后续问题作为新问题发布。
猜你喜欢
  • 2018-08-26
  • 2017-06-17
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多