2012-03-09 7 views
1

私はMongoDBに新たに失敗し、範囲内の価格をフィルタリングしようとしています。特定の要素をフィルタリングするのではなく、まず特別価格が存在するかどうかを確認する必要があります。特別価格が存在し、それが当日/日の範囲内にある場合、通常価格の代わりに使用する必要があります。MongoDBのクエリフィルタの価格

これは私の試みですが、残念ながらそれは動作しません。どうやってこれを正しく行うことができますか?

敬具

db.products.find({ 
  "shops":1, 
  "categories":59, 
  "options":{ 
     "$elemMatch":{ 
        "quantity":{ 
           "$gt":0 
        } 
     } 
  }, 
  "$or":[ 
     { 
        "$and":[ 
           { 
              "$and":[ 
                 { 
                    "options.pricing.special.from":{ 
                       "$exists":true 
                    } 
                 }, 
                 { 
                    "options.pricing.special.to":{ 
                       "$exists":true 
                    } 
                 } 
              ] 
           }, 
           { 
              "$or":[ 
                 { 
                    "$and":[ 
                       { 
                          "options.pricing.special.from":{ 
                             "$gt":{ 
                                "sec":1331291423, 
                                "usec":76000 
                             } 
                          } 
                       }, 
                       { 
                          "options.pricing.special.to":{ 
                             "$lt":{ 
                                "sec":1331291423, 
                                "usec":76000 
                             } 
                          } 
                       }, 
                       { 
                          "options.pricing.price":{ 
                             "$gte":0, 
                             "$lte":0 
                          } 
                       } 
                    ] 
                 }, 
                 { 
                    "$and":[ 
                       { 
                          "options.pricing.special.from":{ 
                             "$lte":{ 
                                "sec":1331291423, 
                                "usec":76000 
                             } 
                          } 
                       }, 
                       { 
                          "options.pricing.special.to":{ 
                             "$gte":{ 
                                "sec":1331291423, 
                                "usec":76000 
                             } 
                          } 
                       }, 
                       { 
                          "options.pricing.special.price":{ 
                             "$gte":0, 
                             "$lte":0 
                          } 
                       } 
                    ] 
                 } 
              ] 
           } 
        ] 
     }, 
     { 
        "$and":[ 
           { 
              "$and":[ 
                 { 
                    "options.pricing.special.from":{ 
                       "$exists":false 
                    } 
                 }, 
                 { 
                    "options.pricing.special.to":{ 
                       "$exists":false 
                    } 
                 } 
              ] 
           }, 
           { 
              "options.pricing.price":{ 
                 "$gte":0, 
                 "$lte":0 
              } 
           } 
        ] 
     } 
  ] 
}).sort({ 
  "created_at":-1 
}) 

サンプル文書:

{ 
    "_id" : ObjectId("4f59047d8b446bac05000000"), 
    "created_at" : new Date("Wed, 11 Feb 2009 13:54:09 GMT +01:00"), 
    "modified_at" : new Date("Thu, 08 Mar 2012 20:11:17 GMT +01:00"), 
    "sku" : "K2 - N30052005", 
    "name" : { 
    "en" : "Pants - Nintendo", 
    "da" : "Bukser - Nintendo" 
    }, 
    "description" : { 
    "en" : "<p>Super fed buks fra Designers Remix Collection. De har store lommer\r\nved hofterne, som giver buksen et lækkert ridebuks-look. De har smalle\r\nben, som gør modellen super feminin, samtidig med de er højtaljede.\r\nBrug dem med en top eller skjorte, samt et par lækre stiletter. </p>\r\n<ul>\r\n <li>65 % polyester</li>\r\n <li>35 % viscose </li>\r\n <li>Buksen skal sendes til rens - Stryges på indersiden, for at holde den skinnende overflade</li>\r\n</ul>", 
    "da" : "<p>Super fed buks fra Designers Remix Collection. De har store lommer\r\nved hofterne, som giver buksen et lækkert ridebuks-look. De har smalle\r\nben, som gør modellen super feminin, samtidig med de er højtaljede.\r\nBrug dem med en top eller skjorte, samt et par lækre stiletter.&nbsp; </p>\r\n<ul>\r\n <li>65 % polyester</li>\r\n <li>35 % viscose </li>\r\n <li>Buksen skal sendes til rens - Stryges på indersiden, for at holde den skinnende overflade</li>\r\n</ul>" 
    }, 
    "url_key" : { 
    "en" : "designers-remix-collection-pants-nintendo", 
    "da" : "designers-remix-collection-bukser-nintendo" 
    }, 
    "categories" : [15, 68, 84], 
    "shops" : [2], 
    "images" : [{ 
     "src" : "designers-remix-collection-bukser-nintendo-1-1.jpg", 
     "alt" : "" 
    }, { 
     "src" : "designers-remix-collection-bukser-nintendo-1-2.jpg", 
     "alt" : "" 
    }, { 
     "src" : "designers-remix-collection-bukser-nintendo-1-3.jpg", 
     "alt" : "" 
    }, { 
     "src" : "designers-remix-collection-bukser-nintendo-1-4.jpg", 
     "alt" : "" 
    }], 
    "options" : [{ 
     "size" : { 
     "da" : "34", 
     "en" : "34" 
     }, 
     "quantity" : 0, 
     "shipping" : { 
     "weight" : 0, 
     "depth" : 0, 
     "height" : 0, 
     "width" : 0 
     }, 
     "pricing" : { 
     "price" : 129900, 
     "cost" : 48100, 
     "retail" : 0, 
     "vat" : 25, 
     "special" : { 
      "price" : 38900, 
      "from" : new Date("Fri, 01 Jul 2011 00:00:00 GMT +02:00"), 
      "to" : new Date("Sun, 30 Jun 2013 00:00:00 GMT +02:00") 
     }, 
     "savings" : 91000, 
     "pct_savings" : 70.0 
     }, 
     "sortable_sizes" : { 
     "da" : ["XS"], 
     "en" : ["XS"] 
     } 
    }, { 
     "size" : { 
     "da" : "36", 
     "en" : "36" 
     }, 
     "quantity" : 0, 
     "shipping" : { 
     "weight" : 0, 
     "depth" : 0, 
     "height" : 0, 
     "width" : 0 
     }, 
     "pricing" : { 
     "price" : 129900, 
     "cost" : 48100, 
     "retail" : 0, 
     "vat" : 25, 
     "special" : { 
      "price" : 38900, 
      "from" : new Date("Fri, 01 Jul 2011 00:00:00 GMT +02:00"), 
      "to" : new Date("Sun, 30 Jun 2013 00:00:00 GMT +02:00") 
     }, 
     "savings" : 91000, 
     "pct_savings" : 70.0 
     }, 
     "sortable_sizes" : { 
     "da" : ["S"], 
     "en" : ["S"] 
     } 
    }, { 
     "size" : { 
     "da" : "38", 
     "en" : "38" 
     }, 
     "quantity" : 0, 
     "shipping" : { 
     "weight" : 0, 
     "depth" : 0, 
     "height" : 0, 
     "width" : 0 
     }, 
     "pricing" : { 
     "price" : 129900, 
     "cost" : 48100, 
     "retail" : 0, 
     "vat" : 25, 
     "special" : { 
      "price" : 38900, 
      "from" : new Date("Fri, 01 Jul 2011 00:00:00 GMT +02:00"), 
      "to" : new Date("Sun, 30 Jun 2013 00:00:00 GMT +02:00") 
     }, 
     "savings" : 91000, 
     "pct_savings" : 70.0 
     }, 
     "sortable_sizes" : { 
     "da" : ["M"], 
     "en" : ["M"] 
     } 
    }, { 
     "size" : { 
     "da" : "40", 
     "en" : "40" 
     }, 
     "quantity" : 0, 
     "shipping" : { 
     "weight" : 0, 
     "depth" : 0, 
     "height" : 0, 
     "width" : 0 
     }, 
     "pricing" : { 
     "price" : 129900, 
     "cost" : 48100, 
     "retail" : 0, 
     "vat" : 25, 
     "special" : { 
      "price" : 38900, 
      "from" : new Date("Fri, 01 Jul 2011 00:00:00 GMT +02:00"), 
      "to" : new Date("Sun, 30 Jun 2013 00:00:00 GMT +02:00") 
     }, 
     "savings" : 91000, 
     "pct_savings" : 70.0 
     }, 
     "sortable_sizes" : { 
     "da" : ["L"], 
     "en" : ["L"] 
     } 
    }], 
    "attributes" : { 
    "size" : { 
     "name" : { 
     "da" : "Størrelse", 
     "en" : "Size" 
     }, 
     "type" : "select", 
     "required" : true, 
     "visible" : true, 
     "option" : true, 
     "sortable" : false 
    }, 
    "color" : { 
     "name" : { 
     "da" : "Farve", 
     "en" : "Color" 
     }, 
     "type" : "select", 
     "required" : true, 
     "visible" : true, 
     "option" : false, 
     "sortable" : false, 
     "default" : { 
     "da" : "Sort", 
     "en" : "Black" 
     }, 
     "value" : { 
     "da" : ["Sort"], 
     "en" : ["Black"] 
     } 
    }, 
    "type" : { 
     "name" : { 
     "da" : "Type", 
     "en" : "Type" 
     }, 
     "required" : false, 
     "option" : false, 
     "sortable" : false, 
     "value" : { 
     "da" : "tempType", 
     "en" : "tempType" 
     } 
    }, 
    "manufacturer" : { 
     "name" : { 
     "da" : "Designer", 
     "en" : "Designer" 
     }, 
     "required" : false, 
     "option" : false, 
     "sortable" : false, 
     "value" : { 
     "da" : "Designers Remix Collection", 
     "en" : "Designers Remix Collection" 
     } 
    }, 
    "sortable_colors" : { 
     "name" : { 
     "da" : "Sorterbare farver", 
     "en" : "Sortable Colors" 
     }, 
     "type" : "system", 
     "required" : false, 
     "option" : false, 
     "visible" : false, 
     "sortable" : true, 
     "value" : { 
     "en" : ["Black"], 
     "da" : ["Sort"] 
     } 
    }, 
    "sortable_sizes" : { 
     "name" : { 
     "da" : "Sorterbare størrelser", 
     "en" : "Sortable Sizes" 
     }, 
     "type" : "system", 
     "required" : false, 
     "option" : true, 
     "visible" : false, 
     "sortable" : true 
    } 
    } 
} 
+0

あなたは私たちにいくつかのサンプル文書を与えることができます。 –

+0

質問に含まれています: – Kristian

答えて

2

私は40000に35000の価格帯を設定し、それは特別価格と一致します。次に、35000〜150000の2番目の例がメイン価格と一致するようにします。いずれにしても、これが役立つことを願っています。

私は、あなたが不足しているクエリの重要な部分は「elemMatch」だと思います。価格設定属性に埋め込みオブジェクトを含む配列を使用しないことで、スキーマのクエリを容易にすることができます。

// testing first part of the $or 
    var query = {$or: 
    [{"options": 
     { 
     $elemMatch: 
      {"pricing.special.price":{$exists:true}, 
      "pricing.special.from":{$lt:new Date()}, 
      "pricing.special.to":{$gt:new Date()}, 
      "pricing.special.price":{$gt:35000}, 
      "pricing.special.price":{$lt:40000} 
      } 
     } 
    }, 
    {"options": 
     {$elemMatch: 
      { 
       "pricing.price":{$gt:35000}, 
       "pricing.price":{$lt:40000} 
      } 
     } 
    }] 
    }; 

これも一致します。

// testing out of the date range... and increasing the max price 
    var query = {$or: 
    [{"options": 
     { 
     $elemMatch: 
      {"pricing.special.price":{$exists:true}, 
      "pricing.special.from":{$lt:new Date("Jan 1, 2014")}, 
      "pricing.special.to":{$gt:new Date("Jan 1, 2014")}, 
      "pricing.special.price":{$gt:35000}, 
      "pricing.special.price":{$lt:150000} 
      } 
     } 
    }, 
    {"options": 
     {$elemMatch: 
      { 
       "pricing.price":{$gt:35000}, 
       "pricing.price":{$lt:150000} 
      } 
     } 
    }] 
    }; 
+0

ありがとうウェス、非常に感謝! – Kristian