2017-02-14 10 views
0

Я пытаюсь сделать сложный запрос mongo и после нескольких часов пробной версии, и только ошибка, я здесь, чтобы обратиться за помощью.Найти элементы, имеющие хотя бы один элемент в массиве и не имеющий ничего, кроме массива

Давать следующие документы:

{ 
    // Item 1 
    name: 'Tranças Nordestinas', 
    author: 'Daiane Rosa', 
    ingredients: [ 
     'wheatFlour', 
     'sugar', 
     'butter', 
     'bakingPowder', 
     'eggs' 
    ] 
} 

{ 
    // Item 2 
    name: 'Brigadeiro de Churros', 
    author: 'Cristine Russel', 
    ingredients: [ 
     'sugar', 
     'chocolate' 
    ] 
} 

{ 
    // Item 3 
    name: 'Chá Mate Gelado', 
    author: 'Victor Onofre', 
    ingredients: [ 
     'sugar', 
     'water' 
    ] 
} 

{ 
    // Item 4 
    name: 'Macarrão Verde ao Molho', 
    author: 'Victor Onofre', 
    ingredients: [ 
     'greenPasta', 
     'tomatoSauce', 
     'butter' 
    ] 
} 

Если я запрашиваю массив [ «сахар», «вода»], только третий пункт Шоуда возвращается.

Если я запрошу массив ['water', 'chocolate', 'wheatFlour', 'sugar', 'butter', 'bakingPowder', 'eggs'], пункты 1, 2 и 3 должны быть возвращены.

И если я запрашиваю массив ['sugar'], ни один элемент не должен возвращаться.

Не удалось найти способ выполнения такого запроса. Не знаете, подходит ли mongodb для этого запроса, сможет ли mysql работать лучше в этой ситуации?

Спасибо.

ответ

1

Вы можете попробовать $redact с $setIsSubset по вашему запросу.

$setSubset сравнить ингредиенты массивы с входным массивом и возвращает true, когда массив ингредиентов является подмножеством входного массива, который включает в себя равно слишком и $redact будет использовать результат сравнения сверху; true Значение для сохранения и false Значение для удаления документа.

db.collection.aggregate(
    [{ 
     $redact: { 
      $cond: { 
       if: { 
        $setIsSubset: ["$ingredients", ['sugar']] 
       }, 
       then: "$$KEEP", 
       else: "$$PRUNE" 
      } 
     } 
    }] 
); 
+0

Работы как очарование. Большое спасибо! –