2016-07-29 6 views
3

同じドキュメントの複数のレコードがあるコレクションを見るmongoDBスクリプトを見つけようとしていますが、各ドキュメントの最新バージョンのみを結果セット。最新のバージョンのドキュメントをmongoDBの日付で照会します

私はそれを英語より上の方で説明することはできませんが、下のほんの少しのSQLでそれをさらに説明するかもしれません。私は各文書をtransaction_referenceとしたいが、最新の日付版(object_creation_date)のみを欲しい。

select 
    t.transaction_reference, 
    t.transaction_date, 
    t.object_creation_date, 
    t.transaction_sale_value 
from MyTable t 
inner join (
    select 
     transaction_reference, 
     max(object_creation_date) as MaxDate 
    from MyTable 
    group by transaction_reference 
) tm 
    on t.transaction_reference = tm.transaction_reference 
    and t.object_creation_date = tm.MaxDat 

同じ文書の複数のバージョンがある理由は、トランザクションの各反復を保存したいからです。初めてドキュメントを受け取ったとき、それはUNPAIDのtransaction_statusにある可能性があります。そして、同じトランザクションを再度受け取り、今度はtransaction_statusがPAIDです。

いくつかの分析は、すべての一意のトランザクションをSUMすることですが、他の分析では、UNPAIDステータスの文書とPAIDの次の文書との間の時間間隔を測定することがあります。私は質問を理解していれば、あなたのサポートのための

{ 
"_id": { 
    "$oid": "579aa337f36d2808839a05e8" 
}, 
"object_class": "Goods & Services Transaction", 
"object_category": "Revenue", 
"object_type": "Transaction", 
"object_origin": "Sage One", 
"object_origin_category": "Bookkeeping", 
"object_creation_date": "2016-07-05T00:00:00.201Z", 
"party_uuid": "dfa1e80a-5521-11e6-beb8-9e71128cae77", 
"connection_uuid": "b945bd7c-7988-4d2a-92f5-8b50ab218e00", 
"transaction_reference": "SI-1", 
"transaction_status": "UNPAID", 
"transaction_date": "2016-06-16T00:00:00.201Z", 
"transaction_due_date": "2016-07-15T00:00:00.201Z", 
"transaction_currency": "GBP", 
"goods_and_services": [ 
    { 
     "item_identifier": "PROD01", 
     "item_name": "Product One", 
     "item_quantity": 1, 
     "item_gross_unit_sale_value": 1800, 
     "item_revenue_category": "Sales Revenue", 
     "item_net_unit_cost_value": null, 
     "item_net_unit_sale_value": 1500, 
     "item_unit_tax_value": 300, 
     "item_net_total_sale_value": 1500, 
     "item_gross_total_sale_value": 1800, 
     "item_tax_value": 300 
    } 
], 
"transaction_gross_value": 1800, 
"transaction_gross_curr_value": 1800, 
"transaction_net_value": 1500, 
"transaction_cost_value": null, 
"transaction_payments_value": null, 
"transaction_payment_extras_value": null, 
"transaction_tax_value": 300, 
"party": { 
    "customer": { 
     "customer_identifier": "11", 
     "customer_name": "KP" 
    } 
} 
} 

、それは今

{ 
"_id": { 
    "$oid": "579aa387f36d2808839a05ee" 
}, 
"object_class": "Goods & Services Transaction", 
"object_category": "Revenue", 
"object_type": "Transaction", 
"object_origin": "Sage One", 
"object_origin_category": "Bookkeeping", 
"object_creation_date": "2016-07-16T00:00:00.201Z", 
"party_uuid": "dfa1e80a-5521-11e6-beb8-9e71128cae77", 
"connection_uuid": "b945bd7c-7988-4d2a-92f5-8b50ab218e00", 
"transaction_reference": "SI-1", 
"transaction_status": "PAID", 
"transaction_date": "2016-06-16T00:00:00.201Z", 
"transaction_due_date": "2016-07-15T00:00:00.201Z", 
"transaction_currency": "GBP", 
"goods_and_services": [ 
    { 
     "item_identifier": "PROD01", 
     "item_name": "Product One", 
     "item_quantity": 1, 
     "item_gross_unit_sale_value": 1800, 
     "item_revenue_category": "Sales Revenue", 
     "item_net_unit_cost_value": null, 
     "item_net_unit_sale_value": 1500, 
     "item_unit_tax_value": 300, 
     "item_net_total_sale_value": 1500, 
     "item_gross_total_sale_value": 1800, 
     "item_tax_value": 300 
    } 
], 
"transaction_gross_value": 1800, 
"transaction_gross_curr_value": 1800, 
"transaction_net_value": 1500, 
"transaction_cost_value": null, 
"transaction_payments_value": null, 
"transaction_payment_extras_value": null, 
"transaction_tax_value": 300, 
"party": { 
    "customer": { 
     "customer_identifier": "11", 
     "customer_name": "KP" 
    } 
} 
} 

支払われる第二版のおかげで、マット・

+0

ここでデモドキュメントをPOSTしてください。 – rroxysam

答えて

1

:ここに要求ごととして

は、二つの文書です正しくこのようなものを使用することができます

db.getCollection('yourTransactionsCollection').aggregate([ 
    { 
     $sort: { 
      "transaction_reference": 1, 
      "object_creation_date": -1 
     } 
    }, 
    { 
     $group: { 
      _id: "$transaction_reference", 
      "transaction_date": { $first: "$transaction_date" }, 
      "object_creation_date": { $first: "$transaction_date" }, 
      "transaction_sale_value": { $first: "$transaction_sale_value" } 
     } 
    } 
]) 
あなたは $sortがちょうど object_creation_dateを含めることが、私はそれが両方の上に複合インデックスを作成するために理にかなって考えると、私は transaction_referenceobject_creation_dateの両方が含まれて変更することができ、次の

{ 
    "_id" : "SI-1", 
    "transaction_date" : "2016-06-16T00:00:00.201Z", 
    "object_creation_date" : "2016-06-16T00:00:00.201Z", 
    "transaction_sale_value" : null 
} 

ノートのような結果を出力

彼らの創造日の代わりに。 $sortが1になるようにインデックスに従って調整します。
さらに、文書フィールドtransaction_sale_valueがありませんでした。そのため、結果にはnullとなりました。たぶんあなたはそれを逃した、またはそれはあなたのサンプル文書にないだけですが、私はあなたが考えを得て、それをあなたのニーズに合わせることができると思います。

+0

これは、それがスズについてあなたにありがとうと言うように見えます。あなたは正しいのですが、それは 'transaction_sale_value'ではなく' 'transaction_gross_value''です。私は今、それがどのように動作するのかを見ています - これはすごいです。私は$ firstの代わりに$ lastを使うこともできるので、最初と最後のレコードに終わり、それぞれの時間差を計算するための計算に使用されます。あなたの助けをもう一度ありがとう –

関連する問題