2017-09-26 13 views
1

私はそこにショートカットがないと感じていますが、まだチェックしたいと思っています。 (費用の合計) - クエリを挿入クエリと組み合わせる

は、私はこの

[{ 
userName: "Mr. A" 
income: 100 
expense: null 
finalBalance: 200 
timestamp: Date.now() 
}] 

*私たちは、所得額がある場合は、費用はnullになりますし、=(収入の合計)、その逆 最終的なバランスのように見えるのコレクションを持っていると言いますスタック:mongodB + node.js

基本的に、新しい「finalBalance」を毎回計算することを含む、新しいオブジェクトをコレクションに挿入するための最短かつ最良の方法を知る必要があります。

私がやっていることは、上に示すような新しいトランザクションを挿入する必要があるたびにです。 "timestamp"と "userName"を使用してそのユーザーの最後のトランザクションを取り出し、そこから収入または費用を加算または減算し、 新しいオブジェクトを作成して挿入します。例えば

ユーザーの

最後のトランザクション:

{ 
userName: "Mr. A" 
income: 100 
expense: null 
finalBalance: 200 
timestamp: Date.now() 
} 

は詳細

({userName: "Mr. A", expense: 10}) 

ステップ1とユーザーの新しいトランザクションを挿入する必要があります。最後のフェッチ(DBから取得します)最後の "finalBalance"を得るために、DBからのユーザのトランザクション。

ステップ2:れる新しい "finalBalance" を取得する "finalBalance" から "費用" 量をsubstract(200から10 = 190)

ステップ3:(DBの挿入)は

インサートメイク
{ 
userName: "Mr. A" 
income: null 
expense: 10 
finalBalance: 190 
timestamp: Date.now() 
} 

新しい「finalBalance」を計算し、1回のDB呼び出しで新しいオブジェクトを挿入する方法はありますか?

ソリューションは、あなたがそれを更新するために、独自の文書の値を使用することはできませんmongo.js

答えて

0

である場合、それは素晴らしいことです。したがって、この種の操作を実行するには、findにして、forEachで反復処理する必要があります。その後、それはあなたのドキュメント(複数可)を与えると、あなたがそれらを変更することができるようになりますとsaveそれらを:

var yourObj = {userName: "Mr. A", expense: 10}; 
db.collection.find({yourObj.userName}).forEach(doc => { 
    doc.finalBalance = doc.finalBalance - yourObj.expense; 
    doc.timestamp: Date.now(); 

    db.events.save(doc); 
}) 


はそれが役に立てば幸い、それを試してみて、期待どおりに動作するかどうか教えてください、
よろしくお願いいたします

+0

こんにちは、私はこれを試していただきありがとうございます。しかし、これは私の場合は機能しません。私は完全なもののための単一のクエリが必要なので、質問には言及されていませんが、私は配列やそのようなトランザクションが挿入されるように、そのクエリを使用して多くを挿入します。しかし、ええ、あなたの提案を使用することができますクエリのような種類の書き込みができない場合はええ。 –

関連する問題