【问题标题】:How to get data from MongoDB to simple array using Node.JS and Mongoose?如何使用 Node.JS 和 Mongoose 从 MongoDB 获取数据到简单数组?
【发布时间】:2023-03-11 00:25:02
【问题描述】:

假设这是我的 MongoDB 架构:

    var shopSchema = new mongoose.Schema({
        nameShop: String,
        products: [
            {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Product'
            }]
    });

    var productSchema = new mongoose.Schema({
        nameProduct: String,
        fruits: [
            {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Fruit'
            }
        ]
    });

    var fruitSchema = new mongoose.Schema({
        nameFruit: String,
        price: Number
    });

module.exports = {
    Shop: mongoose.model('Shop', shopSchema),
    Product: mongoose.model('Product', productSchema),
    Fruit: mongoose.model('Fruit', fruitSchema)
}

我知道我可以通过这种方式获取数据,但是该代码的结果是一个“丑陋”的数组

var Schema = require('../model/schema');
    Schema.Shop.find({}).populate({
        path: 'products',
        model: 'Product',
        populate: {
            path: 'fruits',
            model: 'Fruit'
        }
    }).exec(callback);

是否有可能从这个模式中获取数据,以使我拥有漂亮的数组?例如:

var MyArray = [
                  { nameShop: "Tesco", nameProduct: "New", nameFruit: "Apple", price: 10 },
                  { nameShop: "Tesco", nameProduct: "New", nameFruit: "Pinapple", price: 4 },
                  { nameShop: "Eko", nameProduct: "Old", nameFruit: "Kiwi", price: 8 },
                  { nameShop: "Makro", nameProduct: "Fresh", nameFruit: "Pear", price: 7 },
                  { nameShop: "Carefour", nameProduct: "New", nameFruit: "Orange", price: 6 }
              ];

【问题讨论】:

    标签: javascript node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    您可以采用聚合框架路线,该路线具有通过 $unwind 运算符展平数组的能力。这将为应用展开的列表数据字段的每个元素生成一条新记录。它基本上使数据变平。

    扁平化数据后,您需要 $lookup 运算符将products 字段“加入”到products 集合。对嵌套的 fruits 模式重复该过程。

    让我们看一个示例(未经测试)以更好地理解这一点

    var Schema = require('../model/schema');
    Schema.Shop.aggregate([
        { "$unwind": "$products" },
        {
            "$lookup": {
                "from": "products",
                "localField": "products",
                "foreignField": "_id",
                "as": "product"
            }
        },
        { "$unwind": "$product" },
        { "$unwind": "$product.fruits" },
        {
            "$lookup": {
                "from": "fruits",
                "localField": "product.fruits",
                "foreignField": "_id",
                "as": "fruits"
            }
        },  
        {
            "$project": {
                "nameShop": 1,
                "nameProduct": "$product.nameProduct",
                "nameFruit": "$fruits.nameFruit",
                "price": "$fruits.price",
            }
        }
    ]).exec(function (err, result){
        if (err) throw err;
        console.log(result);
    })
    

    免责声明:以上是未经测试的代码,仅作为指导,假设您在测试环境中运行代码,并使用最新的 MongoDB 和支持 $lookup 运算符并且您可以在 mongo shell 中执行相同的聚合查询。

    【讨论】:

    • 结果是空数组,无论如何我会尝试解决这个问题:)
    • 这是结果:prnt.sc/bmhft4 里面是水果阵列 我想你误解了我的意思。这正是我所期望的:prnt.sc/bmhnpg 这可能吗?
    • 有什么想法或者我应该找到另一个解决方案,因为这样就不可能得到它?
    • 那么也许我应该在我当前的“丑陋”数组上使用 foreach 创建这个数组?
    • 因为在您的示例中,我只能从每个 Product 获得第一个 Fruit
    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 2013-11-06
    • 2012-02-12
    • 2011-11-20
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多