2016-06-28 32 views
0

比方說,這是我的MongoDB架構:如何使用Node.JS和Mongoose從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

回答

1

你可以去聚合框架路線,已通過$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和貓鼬版本的測試環境,它支持運算符$lookup,並且您可以在mongo shell中執行相同的聚合查詢。

+0

結果是空陣列,無論如何,我會盡力解決這個問題:) – DiPix

+0

這是結果:http://prnt.sc/bmhft4裏面是水果數組我認爲你誤會了我。這是我的預期:http://prnt.sc/bmhnpg它甚至有可能嗎? – DiPix

+0

任何想法或我應該找到另一個解決方案,因爲那樣就不可能得到它? – DiPix

相關問題