【问题标题】:How to connect schemas with each other in mongooseJS?如何在 mongooseJS 中将模式相互连接?
【发布时间】:2020-01-23 16:04:39
【问题描述】:

基本上我想要实现的目标如下: 在我的 iOS 应用程序中,可以扫描二维码以获取特定休息室的 ID,并将其 JSON 数据(目前只有 ID 和名称)保存在 MongoDB 中。

每个休息室都可以(但不是必须)将产品添加到他们的休息室,这样最终,客户在扫描二维码后就可以看到提供了哪些产品。

目前,产品仅包含名称和图片网址,但不包含价格,因为价格可能会发生变化,并由休息室的所有者设置。因此,同一种产品的价格可能会有所不同。

我想知道,为该方法实施架构的正确和最佳方法是什么,以便我可以轻松获取特定休息室的所有产品,可能基于其 ID。

到目前为止我得到了什么:

休息室.js:

const mongoose = require('mongoose');

const loungeSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: { type: String, required: true }
});

module.exports = mongoose.model('Lounge', LoungeSchema);

product.js

const mongoose = require('mongoose');

const productSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: { type: String, required: true },
    imageURL: { type: String, required: true, unique: true }
});

module.exports = mongoose.model('Product', productSchema);

【问题讨论】:

    标签: node.js mongodb mongoose schema


    【解决方案1】:

    基本上你可以使用mongoose populate。您可以通过将产品存储在单独的集合中来实现这一点,并基本上使用休息室的 _id 在休息室模式上填充一个数组,让我向您展示一个示例:

    您的休息室架构应该是这样的

    const mongoose = require('mongoose');
    
    const loungeSchema = mongoose.Schema({
        _id: mongoose.Schema.Types.ObjectId,
        name: { type: String, required: true }
        products: [type: Schema.Types.ObjectId, ref: 'Products' ]
    });
    
    module.exports = mongoose.model('Lounge', loungeSchema);
    
    

    还有你的产品架构

    const mongoose = require('mongoose');
    
    const productSchema = mongoose.Schema({
        _id: mongoose.Schema.Types.ObjectId,
        name: { type: String, required: true },
        imageURL: { type: String, required: true, unique: true }
    });
    
    module.exports = mongoose.model('Product', productSchema);
    

    保存创建休息室时,只需将产品的 _id 添加到休息室架构之外的 products 数组。 所以基本上你找到产品并检索它的_id。

    要运行查找查询,应该是这样的:

    lounge.find({}).populate('products').exec();
    

    products 数组将包含每个休息室的相关产品

    【讨论】:

    • 谢谢!这是一个非常详细的答案!但是,如果我想在创建新休息室时直接将产品添加到 productsArray 中,那么休息室文档的 post 方法会是什么样子?发布没有任何产品的休息室时 productsArray 可以为空吗?
    • 为了保持一致性,最好先添加休息室,然后再添加产品。因此,每个方法都有一个单独的方法。如果休息室没有产品,则该字段将为空。有关详细信息,请参阅链接; mongoosejs.com/docs/populate.html#doc-not-found 甚至使用普通的 ref 填充,将产品的 objectIds 保存到产品数组中。 ref 将自动不检索适当的文档mongoosejs.com/docs/populate.html#saving-refs
    • 以下情况:我作为管理员,我想先创建产品,说明应用程序中有哪些产品可用,以便我告诉休息室类似:“我们得到以下应用程序中可用的产品以及您作为用户在创建休息室时,可以决定您希望以何种价格提供这些产品中的哪些”。我认为有了这些背景知识,您的答案正在改变,我错了吗? :)
    • 好的,我知道了。我将使用 refs 更新我的答案
    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 2017-01-13
    • 2018-10-22
    • 2012-10-19
    • 2012-02-03
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多