2015-09-28 2 views
1

У меня есть следующие коллекции в Монго:

> db.styles.find({ "_id" : "EP01L"}).pretty(); 
{ 
    "_id" : "EP01L", 
    "__v" : 5, 
    "categoryIds" : [ 
     ObjectId("5550dcc7a14c976741483c89"), 
     ObjectId("5550dcc7a14c976741483c8d") 
    ], 
    "collectionId" : ObjectId("5550dab4a14c9766418ff2af"), 
    "colours" : { 
     "WH" : [ 
      { 
       "on_sale" : false, 
       "size_code_id" : "S", 
       "sku" : "EP01L-WH1" 
      }, 

     ], 
     "BL" : [ 
      { 
       "on_sale" : false, 
       "size_code_id" : "S", 
       "sku" : "EP01L-BL1" 
      }, 

     ] 
    }, 
    "fabric" : { 
     "material" : [ 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2c4"), 
       "value" : 100 
      } 
     ], 
     "type" : ObjectId("5550dab4a14c9766418ff2d1"), 
     "weight" : { 
      "ounce" : { 
       "min" : 4 
      }, 
      "gram" : { 
       "min" : 155 
      } 
     } 
    }, 

    "name" : { 
     "es-ES" : "CAMISETA MANGA LARGA HOMBRE", 
     "it-IT" : "T-SHIRT UOMO MANICA LUNGA", 
     "en-UK" : "MEN’S LONG SLEEVE T-SHIRT", 
     "fr-FR" : "T-SHIRT HOMME MANCHES LONGUES" 
    }, 
} 

и

> db.attributes.find({"name.en-UK": "Fabric"}).pretty(); 
{ 
    "_id" : ObjectId("5550dab4a14c9766418ff2dc"), 
    "values" : { 
     "source" : [ 
      { 
       "code" : 1, 
       "_id" : ObjectId("5550dab4a14c9766418ff2bf"), 
       "name" : { 
        "fr-FR" : "Coton", 
        "it-IT" : "Cotone", 
        "en-UK" : "Cotton", 
        "es-ES" : "Algodón" 
       } 
      }, 
      { 
       "code" : 2, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c0"), 
       "name" : { 
        "fr-FR" : "Viscose", 
        "it-IT" : "Viscosa", 
        "en-UK" : "Viscose", 
        "es-ES" : "Viscosa" 
       } 
      }, 

     ], 
     "name" : [ 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2cd"), 
       "name" : { 
        "en-UK" : "3-ply Loopback" 
       } 
      }, 

      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2db"), 
       "name" : { 
        "en-UK" : "Woven Twill" 
       } 
      } 
     ] 
    }, 
    "name" : { 
     "en-UK" : "Fabric" 
    } 
} 

я пытаюсь написать запрос, чтобы найти все документы стиля, где ткань .source - это либо хлопок, либо вискоза, а fabric.name - тканая твил.

этот запрос дает мне все документы, которые fabric.type являются хлопок или вискоза

> db.styles.find({ "fabric.type": { $in: [ ObjectId("5550dab4a14c9766418ff2cd"), ObjectId("5550dab4a14c9766418ff2db") ] } }).count(); 
3 
> 

но как я найти все стили, где size_code_id является S и красите WH?

Какой совет высоко ценится

ответ

0

Пожалуйста, проверьте ниже запрос:

db.styles.find({ 
        $and:[ 
          { "colours.WH" :{ $exists:1 } } , 
          { "colours.WH.size_code_id" : "S"} 
         ] 
       } 
       ).pretty(); 

Если вам необходимо найти для "WH" и "BL", вы можете запросить, как показано ниже:

db.styles.find({ 
        $or:[ 
          { 
           $and:[ 
             { "colours.WH" :{ $exists:1 } } , 
             { "colours.WH.size_code_id" : "S"} 
            ] 
          }, 
          { 
           $and:[ 
             { "colours.BL" :{ $exists:1 } } , 
             { "colours.BL.size_code_id" : "S"} 
            ] 
          } 
         ] 
       } 
       ).pretty(); 

PS: Если вам нужно запросить несколько цветов, скажем, для некоторых 5-10 разных цветов, тогда вы должны построить запрос динамически для всех этих co lors с использованием конструкций языка JavaScript.

Ниже протестированный код для построения запроса динамически:

// Colours you want to search 
var varray = new Array("WH","BL"); 
var fname = "colours", lname = "size_code_id"; 
var arr = new Array(); 
var mquery = {"$or":[]}; 

for(var i = 0; i < varray.length; i++) 
{ 
    var query = { "$and" : []}; 

    // This line will dynamically construct a key as "colours.WH" 
    var s1 = fname.concat(".").concat(varray[i]); 
    // This line will dynamically construct a key as "colours.WH.size_code_id" 
    var s2 = fname.concat(".").concat(varray[i]).concat(".").concat(lname); 
    var sub1 = {}, sub2 = {}; 

    sub1[s1] = { $exists:1 }; 
    sub2[s2] = "S"; 

    query["$and"].push(sub1); 
    query["$and"].push(sub2); 

    arr.push(query); 
} 
mquery["$or"] =arr; 

db.styles.find(mquery); 
+0

спасибо, но как у меня есть несколько цветов, например, все WH и BL? – khinester

+0

Я отредактировал мое сообщение, пожалуйста, проверьте его. –

+0

это здорово, спасибо – khinester

Смежные вопросы