2017-11-08 15 views
0

私は現在、自分自身の電子商取引ソリューションを開発中です。PHPとMongoDBのクエリ - ドキュメント間の共通の値のリストを取得

まず、そのような製品のドキュメントを見て -

{ 
    "_id" : ObjectId("...."), 
    "sku" : "", 
    "manufacturer" : "", // Manufacturer 
    "quantity" : 0, 
    "price" : 0, 
    "currency" : "", // Currency code 
    "warranty" : "", // Yes/No/True/False 
    "installation" : "", // Installiton type/required 
    "images" : [], // array of img paths 
    "creation" : ISODate("...."), 
    "lastModified" : ISODate("...."), 
    "details" : [], // array of object each for different language 
    "properties" : [ 
     { 
      "property" : "", // property name, unique 
      "value" : "" // propery value 
     } 
    ], 
    "customize" : [ 
     { 
      "property" : "", // property name 
      "type" : "", // input type: radio, select, etc. 
      "options" : [ 
       { 
        "id" : 1, // numeric id 
        "option" : "", // option text 
        "cost" : 0.0 // option additional price 
       } 
      ] 
     } 
    ], 
    "categories" : [], // array of objects {category:1, subs[2,3,4]} 
    "excludes" : [], 
    "shipping" : [], // array of objects {location:FR, price:5, additional: 1} 
} 

だから、私は何をできるようにしたいことは、フィルタ(5の最大、最も一般的な)のリストを取得することです。私が必要

フィルタ:

  1. 簡単なフィルタ - array_of_obj.x +数で利用可能なすべての値(例:properties.property) - メーカー+各
  2. ネストされたフィルタのカウントに利用可能なすべての値
  3. さらに、customize配列とcategories配列のためにネストされていますが、単なるボーナスになります。

どのようにすればよいですか?それは重すぎるでしょうか?

クエリが複雑すぎる場合は、すべての製品を製品の配列に取得する方がよいでしょう(私はPHPを直接データのシリアル化を解除するためにsetTypeMapを使用しています)。次にarray_column、 foreachなど?

+0

「ファセットカウント」を意味すると思います。そして、その別個の価値のための "メーカーの別個のリスト"と "カウント"のようなもの。それは一般的に小さな結果セットを持つ「たくさんのクエリ」として表されます。そのため、いわゆる「ファセット」があり、そのために「 '$ facet'(https://docs.mongodb.com/manual/reference/operator/aggregation/facet/)集約パイプラインステージが存在します。あなたの質問はより明確になるかもしれませんが、それはあなたが探し始めるべきだったのです。 –

+0

[MongoDBクエリの最適化](https://stackoverflow.com/a/27883584/2313887)を見てみてください。これは実際にはすべて「ファセット」に関するもので、「パラレルパイプライン演算子」が存在していたずっと前です。そのようなものとして、ファセットカウントの収集を「最適化」し、そのような「タグ」によるドキュメント選択の助けとなるいくつかの技術がある。トリビアとして、私の最初のMongoDBの使い方は電子商取引でもありました。私はあなたが元々同じミスをしているのを見ることができます。間違いなく "配列内の入れ子になった配列"について再考する必要がありますが、これは本当に悪い考えです。 –

+0

あなたの助けをありがとう@NeilLunnは別の構造を提供できますか?あなたの問題を回避する方法を教えてください。 – Bitmap

答えて

0

Neil Lunnのおかげで、array => object => arrayという複雑な構造の場合でも、$facet集約パイプラインステージを使用して問題を解決することができました。

ここで他の人を助けるために、すぐに完全な説明を記載します。

関連する問題