2016-12-08 2 views
2

Мне нужно сделать специальный запрос. У меня есть список предметов, доступных для производства. С помощью этих данных мне нужно запросить документы, в которых каждый тип элемента находится в списке. Несколько (слегка) простое оформление документов может понравиться.Необычный Mongo DB Query

{ 

    "productname": "iron", 
    "requirements": [ 
     { 
      "ammount": 2, 
      "item": "coal" 
     }, 
     { 
      "ammount": 2, 
      "item": "ironore" 
     } 
    ], 
} 

{ 

    "productname": "coal", 
    "requirements": [ 
     { 
      "ammount": 2, 
      "item": "wood" 
     } 
    ], 
} 

{ 

    "productname": "copper", 
    "requirements": [ 
     { 
      "ammount": 2, 
      "item": "coal" 
     }, 
     { 
      "ammount": 2, 
      "item": "copperore" 
     } 
    ], 
} 

{ 

    "productname": "Chair", 
    "requirements": [ 
     { 
      "ammount": 2, 
      "item": "wood" 
     }, 
     { 
      "ammount": 2, 
      "item": "nails" 
     }, 
     { 
      "ammount": 2, 
      "item": "paint" 
     } 
    ], 
} 
{ 

    "productname": "Wooden Toy", 
    "requirements": [ 
     { 
      "ammount": 2, 
      "item": "wood" 
     }, 
     { 
      "ammount": 2, 
      "item": "paint" 
     } 
    ], 
} 

Пример список может выглядеть следующим образом: [ "дерево", "пиво", "уголь", "краска", "copperore"]

Это должно вернуть документы по "Уголь", «Медь» и «Деревянная игрушка», поэтому все их требования приведены в Списке. Для «Стула» «ногти» отсутствуют, а для «Железа» «Иронора» отсутствует.

(Извините за мой плохой английский;))

+1

Можете ли вы разработать что '' special' и unusual'? – dikesh

+0

Я считаю необычным, что не все части моего запроса нужно сопоставлять, но все требования в целевых документах должны быть заполнены. Возможно, я не объяснил это достаточно хорошо. – justelex

+0

Итак, давайте посмотрим, понимаю ли я: у вас есть список требований, скажем, '[element1, element2, element4]', и вы хотите, чтобы все документы, которые имеют все эти требования? Так, например, они имеют '[element1, element2, element3, element4]'? – GilZ

ответ

0

Вы можете сделать это с помощью $redact и $setIsSubset как $cond Тион

var myList = ["wood", "beer","coal", "paint", "copperore"] 
db.collection.aggregate([ 
    { "$match": { "requirements.item": { "$in": myList } } }, 
    { "$redact": { 
     "$cond": [ 
      { 
       "$setIsSubset": [ 
        "$requirements.item", 
        myList 
       ] 
      }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    }} 
]) 
0

Из ваших данных документов, если вы хотите найти документ, содержащий requirements с coal и coppercore то следующий запрос:

> db.materials.find({"requirements.item" : "coal", "requirements.item": "copperore" }).pretty() 

возвращение будет :

{ 
     "_id" : ObjectId("584990f083842cff8826d44f"), 
     "productname" : "copper", 
     "requirements" : [ 
       { 
         "ammount" : 2, 
         "item" : "coal" 
       }, 
       { 
         "ammount" : 2, 
         "item" : "copperore" 
       } 
     ] 
} 
+0

Это понятно. Но я хочу, чтобы все документы соответствовали более крупному списку. В моем списке может быть 50 элементов, и я хочу получить все документы, которые имеют только полные требования. – justelex

+0

Можете ли вы уточнить, что вы подразумеваете под _fullfilled requirements_ –

+0

В целевых документах есть массив требований. Каждый элемент в этом массиве должен быть указан в списке «Доступные товары» в запросе. (возможно, в этом случае лучше удовлетворять) – justelex

0

Если я правильно понял ваш вопрос (что я не уверен, что знаю), вы можете использовать all Оператор:

db.materials.find({"requirements.item": {$all: ["coal", "copperore"]}}) 
+0

Нет, что соответствовало бы всем документам, имеющим требования к углю и медору. Но в моем случае у меня есть список [«уголь», «медноре», «бутылка», «пиво», «гвозди» .....] И ему нужно сопоставить все документы, удовлетворяющие всем требованиям. В этом случае это могут быть документы для меди и пива. Я не знаю, что делать, например, в вашем примере. – justelex

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