2017-01-07 14 views
0

時間の経過とともに生成される一連のオブジェクトを含むコレクションがあります。同じコレクションに異なるタイプが格納されているため、オブジェクトあたり(とUID)(UIDは、同じエンティティを時間とともに参照するオブジェクトを識別します)。私はコレクションから最新のオブジェクトを選択しようとしています。手動でクエリー結果を反復することなくこれを行う方法を抱く重大な困難に挑戦しています。コレクションが大きくなると高価になる可能性があるので避けたいものです。例えばForerunnerDbコレクションからオブジェクトの最新バージョンを選択する方法

var db; // assigned elsewhere 
var col = db.collection("res"); 
col.primaryKey("resId"); 
col.insert({ 
    resId: 1, 
    TypeId: "Person", 
    UID: "Bob", 
    Data: {Age: 20, Name:Bob} 
}); 
col.insert({ 
    resId: 2, 
    TypeId: "Person", 
    UID: "Bob", 
    Data: {Age: 25, Name:Bob} 
}); 
col.insert({ 
    resId: 3, 
    TypeId: "Car", 
    UID: "TeslaModelX", 
    Data: {Manufacturer: "Tesla", Owner:"Bob"} 
}); 
col.insert({ 
    resId: 4, 
    TypeId: "Person", 
    UID: "Bill", 
    Data: {Age: 22, Name:Bill} 
}); 

COLから、私は、クエリがresId降順でランク付けしTypeId="Person"ですべてのオブジェクトを選択したい、つまり私はそのためには、オブジェクト4と2を選択するように期待したいです。

上記のコレクションは考案されていますが、実際には、おそらく0000sのエントリとおそらく0000s、おそらくは各UIDのバージョンが00sであることが予想されます。言い換えれば、グループ化されているかどうかにかかわらず、オブジェクトの完全なコレクションを返さず、繰り返します。

私は次のことを試してみましたが、$distinctオペレータは$orderBy 1の前に適用されているので、これは助けない:私は$groupBy$limitを使用することができるはず、私が考えている

col.find(
    { 
     TypeId : {$eq : "Person"} 
     $distinct: { UID: 1} 
    }, 
    { 
     $orderBy: { 
      resId : -1 
     } 
    } 
    ); 

をサブグループを使用して正確な(集約されていない)要素を見つけることができますが、それでも私が望むことをするための何かを得ることはできませんでした。何か案は?

私の現在の解決策は、私のオブジェクトの間にDeletedプロパティを組み込み、新しいエントリを挿入する前に、DB内の既存のすべての削除されていないオブジェクトに対してtrueに設定することです。これによって私は自分が望むことをやり遂げることができますが、例えば、既知の時間枠内またはそれに類似したものの中から最良のものを選ぶことを止めさせることもできます。

答えて

1

あなたはこのような操作を行うことができます。それはきちんと単一のコマンドに包まれ、それはあなたがForerunnerDB v1.x.でそれを買ってあげるほどきれいだいないので、

var tmpObj = {}; 
col.sort({resId: -1}, coll.find({ 
    "TypeId": "Person" 
})).filter(function (doc) { 
    return col._match(doc, { 
     $distinct: { 
      UID: 1 
     } 
    }, {}, 'and', tmpObj); 
}); 

をそれは少し汚いです

col.pipeline() 
    .find({"TypeId": "Person"}) 
    .orderBy({"resId": 1}) 
    .distinct({"UID": 1}) 
    .then(function (err, data) { 
     console.log(data); 
    }); 

が出典::私はForerunnerDBの開発者です

バージョン2は、使用のまさにこの種の、このような何かを可能にする新しいクエリパイプラインシステムを持つことになります。

関連する問題