2016-02-19 75 views
0

我想用find()方法從MongoDB數據庫獲取一些數據,只返回那些包含指定「房間」的文檔。然後,我想要返回找到的房間數組的所有不同值,其鍵值等於「多樣性」。我以兩種不同的方式嘗試了這一點,我可以在我的方法中脫身。第一種方法是鏈接收集方法find()和distinct()。這不起作用:在獲取請求中鏈接收集方法/承諾Node.js

這是plantList收集的樣子:

[ 
{ 
    "_id": { 
     "$oid": "56c11a761b0e60030043cbae" 
    }, 
    "date added": "10/21/2016", 
    "variety": "Lettuce", 
    "room": "Room 1" 
}, 
{ 
    "_id": { 
     "$oid": "56c11a761b0e60030043cbaf" 
    }, 
    "date added": "10/21/2015", 
    "variety": "Tomatoes", 
    "room": "Room 2" 
} 
] 

server.js

//plantList = db collection 
var mongojs = require('mongojs'); 
var MongoClient = require("mongodb").MongoClient; 

MongoClient.connect(process.env.MONGOLAB_URI, function(err, db) { 
var plantList = db.collection("plantList"); 

app.get('/gettypesbyroom/:room', function(req, res) { 
     var roomReq = req.params.room; 
     plantList 
     .find({"room":roomReq}) 
      .toArray() 
       .distinct("variety", function(err, docs) { 
        if (err) throw err; 
        res.json(docs); 
       }); 
}); 
}); 

我的第二個方法是鏈與承諾。然後( )並使用underscore.js來選擇房間數組的鍵(也不起作用):

app.get('/gettypesbyroom/:room', function(req, res) { 
     var roomReq = req.params.room; 
     plantList 
     .find({"room":roomReq}) 
      .toArray(function(err, docs) { 
       if (err) throw err; 
       return docs; 
      }).then(function(docs) { 
      _.keys(docs, function(docs) { return docs.variety; }); 
     }).then(function(varieties) { 
      res.json(varieties); //not inside scope of .get function? 
     }); 
}); 

有什麼我可以做不同的做法,使這些工作或完全不同的方法?

回答

1

嘗試調用它,而不toArray

//plantList = db collection 
app.get('/gettypesbyroom/:room', function(req, res) { 
    var roomReq = req.params.room; 

    plantList 
    .find({ room: roomReq }) 
    .distinct('type', function(err, docs) { 
    if (err) throw err; 
    res.json(docs); 
    }); 
}); 

How Do I Query For Distinct Values in Mongoose

+0

這將返回內部服務錯誤。 – muninn9

+0

@ muninn9,錯誤說的是什麼,以及什麼是堆棧跟蹤? –

+0

我在郵差上運行它,它只是說「500內部服務錯誤」 – muninn9

0

您可以通過兩種方式來完成。一個是使投影操作員更容易 - 只需投射你所需要的東西。例如。如果你有一個文件,看起來像:

{ 
    room: 123, 
    type: 'soundproof_room', 
    other: 'stuff' 
} 

...你可以用這樣的查詢項目它只是選擇type

db.rooms.find({ room: room }, { type: 1 }).toArray(); 

這將使你喜歡對象的數組這樣的:

let roomTypes = [{type: 'soundproof_room'}, {type: 'windy_room'}, {type: 'soundproof_room'}, {type: 'room without doors'}] 

(很顯然,我正在做types起來,我不知道他們到底是什麼。)

然後用一個簡單的地圖:

return res.json(
    roomTypes 
    // extract the type 
    .map(room => room.type) 
    // filter out duplicates 
    .filter((type, idx, self) => self.indexOf(type) === idx) 
); 

(我使用ES6箭頭FN,希望你能讀它,如果不是:babeljs.io/repl/)

另一件事是嘗試一個聚合。

db.rooms.aggregate({ 
    // first find your room 
    $match: { room: room } 
}, 
{ 
    // group by type, basically make distinct types 
    $group: { 
    _id: '$type', 
    count: {$sum: 1} // inc this by 1 for each room of this type 
    } 
}); 

那一個會給你你的房間,它會返回你只有房間類型和每種類型的計數,作爲額外的獎勵。

+0

但當然,這可能不是你所需要的 - 現在從對另一個答案的評論中,我感覺到我並不完全明白你需要什麼?只是你房間的獨特房間類型? – Zlatko

+0

我很抱歉沒有把這個更清楚。答案已更新,以更清楚地反映文件。每個文檔看起來像{房間:'房間2',品種:'生菜',添加日期:'10/21/2016'等。} – muninn9

+0

但是你正在做一個'獨特的'。另外,你正在按房間過濾。因此,在這種情況下,所有房間都是「2號房間」,即使分數更多,每種房間中也只有一個房間? – Zlatko