2016-09-06 10 views
-1

私は容易に想像している問題でひどい苦労をしています。私は何の答えも見つけられませんでした。私はマングース4.5.4と2.2.2のMongoDBマングース - _idと一致するすべてのカテゴリの最後を取得

に私はこのように見ているデータベースを持っているんだ(それを簡単にする):

[ 
     { 
      _id:12547896 
      category:1, 
      state:1, 
      member:256942158, 
      laboratory:69547231, 
      dt: 8-12-2015 
     }, 
     { 
      _id:11547528 
      category:1, 
      state:3, 
      member:256942158, 
      laboratory:69547231, 
      dt: 21-12-2015 
     }, 
     { 
      _id:1554417 
      category:2, 
      state:2, 
      member:256942158, 
      laboratory:65827231, 
      dt: 18-12-2015 
     }, 
     { 
      _id:11547528 
      category:1, 
      state:3, 
      member:256942158, 
      laboratory:69547231, 
      dt:9-12-2015 
     }, 
     { 
      _id:1554417 
      category:3, 
      state:2, 
      member:256942158, 
      laboratory:65827231, 
      dt: 9-12-2015 
     } 
    ] 

私は3つのカテゴリがあります。私は、 'メンバー'と一致するすべてのカテゴリ(カテゴリ1のカテゴリ、カテゴリ2のanotheなど)の最後の要素を含む配列を取得します。私はいくつかの呼び出しを避け、可能ならばマングースのきれいな使い方を学びます。

私はこれしようと試み:

Collection.aggregate([ 
     { 
      $unwind:'$category' 
     }, 
     { 
      $match:{ 
       member:data.id 
      } 
     }, 
     { 
      $sort: { 
       data: -1 
      } 
     }, 
     { 
      $project: { 
       _id:0, 
       category:'$category', 
       state:'$state', 
       date:'$date' 
      } 
     }, 
     { 
      $limit: 3 
     } 
     ],function(err,ts){ 
     console.log(ts); 
    }); 

を...しかし、私はすべてのカテゴリの1を得ることはありません。私は次のようになります:

[ 
     { 
      _id:12547896 
      category:1, 
      state:1, 
      member:256942158, 
      laboratory:69547231, 
      dt: 8-12-2015 
     }, 
     { 
      _id:11547528 
      category:1, 
      state:3, 
      member:256942158, 
      laboratory:69547231, 
      dt:9-12-2015 
     }, 
     { 
      _id:1554417 
      category:3, 
      state:2, 
      member:256942158, 
      laboratory:65827231, 
      dt: 9-12-2015 
     } 
    ] 

私は間違っていますか?私はネット上で見つけることができるすべてを試してみました...してください!

答えて

0

私は非同期ループでクエリを改善しました。それはより良いです。 :-)

export default function loadStatus(req, err, models) { 
    // extract the mongoose model I interested about. 
    var Ts = models.ts; 
    var Mb = models.members; 
    var tot = []; 
    var data = []; 

    // prepare the function to retrieve the last update 
    function asyncLoop(i, callback) { 
     if(i < 7) { 
      // retrieve the values with the variable qr previously prepared 
      Ts.findOne({mb:req.body.id, fb:false, ds:i},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}).exec(function(err,res) { 
       // if it exists, store the values in tot 
       if(res){ 
        tot.push(res); 
       // if it doesn't exist, store a default value 
       }else{ 
        tot.push({_id:0, ds: i,st: 0,dt: 0}); 
       } 
       asyncLoop(i+1, callback); 
      }) 
     } else { 
      callback(); 
     } 
    } 

    // first retrieve the data missing of the member selected 
    return new Promise((resolve, reject) => { 
     Mb.findOne({_id:req.body.id},{date:1,docnumber:1,email:1,phone:1}).exec() 
     .then(function(member){ 
      if(member){ 
       // store the member data in a final variable 
       data.push(member); 
       // second, retrieve the las diseases correspondig to the member with an async loop 
       asyncLoop(0, function(err){ 
        data.push(tot); 
        if(data.length>0){ 
         resolve(data); 
        }else{ 
         reject('got a problem in the query chaine'); 
        } 
       }); 
      } 
     }); 
    }); 
} 
0

ここに答えがあります。私はMongoDbとMongooseを学んでいるだけなので、それについては分かりません。あなたが答えを向上させることができると思うなら、躊躇しないでください。

基本的に、私は完全に外れていました。私は$ unwindを忘れました。また、集計は私が期待したものを得る正しい方法ではありません。メンバーと一致する各カテゴリの '最後の'項目を持っていたかったのです。しかし、現在のところ、クエリの回答を「最後」に限定する方法はありません。最終的に私は約束を使用し、7つのカテゴリに対して7つのクエリを連鎖させることに決めました。ここで

はスキーマです:

var mongoose = require('mongoose'); 

var tsSchema = mongoose.Schema({ 
    ds:{ 
     type: Number, 
     required: true 
    }, 
    mb:{ 
     type: String, 
     required: true 
    }, 
    st:{ 
     type: Number, 
     required: true 
    }, 
    lb:{ 
     type: String, 
     required: true 
    }, 
    dt:{ 
     type: Date, 
     default: Date.now 
    }, 
    fb:{ 
     type: Boolean, 
     default: false 
    } 
}); 

tsSchema.index({ mb: 1, dt: -1 }); 

var Ts = module.exports = mongoose.model('ts', tsSchema); 

、ここでは、クエリです:

export default function loadStatus(req, err, models) { 
    // extract the mongoose model I interested about. 
    var Ts = models.ts; 
    var tot = []; 
    // chaine 7 queries for the seven diseses 
    return new Promise((resolve, reject) => { 
     Ts 
     .findOne({mb:req.body.id, fb:false, ds:0},{_id:1,ds:1,st:1,dt:1}) 
     .sort({dt:-1}) 
     .exec() 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 0,st: 0,dt: 0}); 
      } 
      return Ts.findOne({mb:req.body.id, fb:false, ds:1},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}); 
     }) 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 1,st: 0,dt: 0}); 
      } 
      return Ts.findOne({mb:req.body.id, fb:false, ds:2},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}); 
     }) 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 2,st: 0,dt: 0}); 
      } 
      return Ts.findOne({mb:req.body.id, fb:false, ds:3},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}); 
     }) 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 3,st: 0,dt: 0}); 
      } 
      return Ts.findOne({mb:req.body.id, fb:false, ds:4},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}); 
     }) 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 4,st: 0,dt: 0}); 
      } 
      return Ts.findOne({mb:req.body.id, fb:false, ds:5},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}); 
     }) 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 5,st: 0,dt: 0}); 
      } 
      return Ts.findOne({mb:req.body.id, fb:false, ds:6},{_id:1,ds:1,st:1,dt:1}).sort({dt:-1}); 
     }) 
     .then(function(r){ 
      if(r){ 
       tot.push(r); 
      }else{ 
       // if null, push default value 
       tot.push({_id:0, ds: 6, fb:false, st: 0,dt: 0}); 
      } 
      if(tot.length>0){ 
       resolve(tot); 
      }else{ 
       reject('got a problem in the query chaine'); 
      } 
     }); 
    }); 
} 

重要! - >このようにして非推奨警告が表示されます。プロミスライブラリをプラグインする必要があります。私はデフォルトのES6を選択しました。そうするには、Mongooseと呼ぶ行を追加する必要があります:

// connect at mongoDb datastore 
var mongoURI = "mongodb://localhost/healthprover"; 
mongoose.Promise = global.Promise; 
var db = mongoose.connect(mongoURI, function(err){ 
    if(err){ 
    console.log(err); 
    }else{ 
    console.log('Finalmente sono connesso a Mongo!!!'); 
    } 
}); 

私はそれが誰かを助けることを願っています。乾杯。

関連する問題