javascript - 如何使用 Node.JS 和 Mongoose 将数据从 MongoDB 获取到简单数组?

标签 javascript node.js mongodb mongoose aggregation-framework

假设这是我的 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 }
              ];

enter image description here

最佳答案

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

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

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

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 和 mongoose 版本的测试环境中运行代码。强>$lookup 运算符 AND 表示您可以在 mongo shell 中执行相同的聚合查询。

关于javascript - 如何使用 Node.JS 和 Mongoose 将数据从 MongoDB 获取到简单数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38072792/

相关文章:

javascript - 如何在 angularjs 工厂中解析函数后返回其结果

javascript - 使用 jQuery 重新加载 iframe

node.js - Firebase 管理 SDK : Set/Merge Custom User Claims

javascript - 从 JSON 文件中删除字符串实例,然后解析它

mongodb - 通过将列表 objectid 传递给 findByIdAndUpdate 来更新多个文档

node.js - Mongoose,如何使用两个或条件执行 find()

javascript - 如何防止用户操纵 AJAX 代码的 'data:' 部分?

javascript - 如何使用 jquery 更新 HTML 表格单元格

node.js - Heroku 的 Rest API 使用插件

c# - 使用 C# MongoDB 查询嵌套文档