2014-11-15 67 views
1

我正在使用貓鼬來處理我的數據庫。在兩個小節中執行查詢和抓取結果mongodb

我有以下型號:

var DeviceSchema = mongoose.Schema({ 
    type: Number, 
    pushId: String 
}); 

type屬性可以是0或1

我想執行一個抓取所有文檔的查詢和檢索結果的格式如下:

{ 
    fstType: [ 
     { 
      _id: "545d533e2c21b900000ad234", 
      type: 0, 
      pushId: "123" 
     }, 
     { 
      _id: "545d533e2c21b900000ad235", 
      type: 0, 
      pushId: "124" 
     }, 
    ], 
    sndType: [ 
     { 
      _id: "545d533e2c21b900000ad236", 
      type: 1, 
      pushId: "125" 
     }, 
     { 
      _id: "545d533e2c21b900000ad237", 
      type: 1, 
      pushId: "126" 
     }, 
    ] 
} 

這可能嗎?我想在一個單一的查詢中做到這一點。

謝謝。

+0

能否請您發佈'user'和'device',樣品輸出的樣本文件? – BatScream

+0

請參閱編輯。 ....... –

+0

太好了,讓我試試吧。 – BatScream

回答

1

這可能嗎?我想在一個單一的查詢中做到這一點。

是的。有可能的。您可以通過以下aggregation流水線操作獲得所需的結果。

  • Sorttype參數按升序排列。
  • Group記錄在一起具有相同的type,構建每個組的 文件的數組。在此階段之後,只有兩個記錄將爲 ,每個記錄具有一個稱爲items的屬性,該屬性是每個組的 記錄的數組。
  • 由於我們的記錄是由type排序,該first組將包含 記錄與0類型和second1型。

最後,我們合併這些組,並根據它們的type給它們分別命名。

var model = mongoose.model('collection',DeviceSchema); 

model.aggregate([ 
{$sort:{"type":-1}}, 
{$group:{"_id":"$type", 
     "items":{$push:"$$ROOT"}, 
     "type":{$first:"$type"}}}, 
{$project:{"items":{$cond:[{$eq:["$type",0]}, 
          {"firstType":"$items"}, 
          {"secondType":"$items"}]}}}, 
{$group:{"_id":null, 
     "firstType":{$first:"$items.firstType"}, 
     "secondType":{$last:"$items.secondType"}}}, 
{$project:{"_id":0,"firstType":1,"secondType":1}} 
], function (err, result) { 
if (err) { 
console.log(err); 
return; 
} 
console.log(result); 
}); 

O/P:

{ firstType: 
    [ { _id: '545d533e2c21b900000ad234', type: 0, pushId: '123' }, 
    { _id: '545d533e2c21b900000ad235', type: 0, pushId: '124' } ], 
    secondType: 
    [ { _id: '545d533e2c21b900000ad236', type: 1, pushId: '125' }, 
    { _id: '545d533e2c21b900000ad237', type: 1, pushId: '126' } ] }