2017-01-28 21 views
2

私はモンゴーのコレクションを持っています。私のコレクションは次のように考えることができます:何千ものmongodb文書内で計算を行う最も効率的な方法は何ですか?

{ 
    "kwId" : "123445", 
    "p1": "15" 
    "p2": "25", 
    "date": "2017-01-28" 
} 

{ 
    "kwId" : "123446", 
    "p1": "25" 
    "p2": "30", 
    "date": "2017-01-28" 
} 

{ 
    "kwId" : "123445", 
    "p1": "35" 
    "p2": "40", 
    "date": "2017-01-27" 
} 

{ 
    "kwId" : "123446", 
    "p1": "30" 
    "p2": "50", 
    "date": "2017-01-27" 
} 

私は約44kのドキュメントを持っています。たとえば、2017-01-28と2017-01-27のように、同じkwIdで日付が異なる文書のp1とp2の値の差を求めたいとします。結果の例:

{ 
    "kwId" : "123445", 
    "p1": "20" 
    "p2": "15", 
} 

{ 
    "kwId" : "123446", 
    "p1": "5" 
    "p2": "20", 
} 

これを行う最も効率的な方法は何ですか?私はPHPを使用しています。私が試したことは、指定された日付のすべてのドキュメントを取り出し、PHPの違いを計算することです。かなり遅かったです。

+0

https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/ – Lucero

+0

少なくとも、あなたが 'p1'と' p2'データ型を '文字列ではなく数値です。 – chridam

答えて

1

私は、正しい方法はPHPで計算することであることに気付きました。まず、構造を変更しました。私はkwIdと日付をidとしました。 これには2つの理由があります。

  1. kwIdとdateは両方ともドキュメントを一意にします。
  2. 私はkwIdとdateの両方でドキュメントを照会しています。そのため、処理速度を上げるためにインデックスを作成する必要があります。

    { "ID":{ "KWID":123445、 "日付": "2017年1月28日" }、 "P1"、 "15"、 "P2": "25"私の質問に }

私は「与えられた日付のすべての文書を取得し、PHPの違いを計算し、私が試してみた。これはかなり遅かった。」と述べました。プロセスが完了するまでに約50分かかりました。上記のように文書構造を少し変更した後、PHPのデフォルトの検索機能の代わりにバイナリ検索を使用して、今や私はミリ秒だけ待たなければなりません。

関連する問題