2017-02-02 3 views
1

Использование mongodb, я пытаюсь найти записи, в которых name соответствует введенным пользователем среди определенного списка категорий или где категории из того же списка соответствуют пользовательский ввод.Mongodb, найти записи из названия или категорий из списка определенных категорий

Я хочу, чтобы отфильтровать коллекцию, чтобы показывать только эти категории ["major olympian", "twelve titan", "primordial deity"]

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

Перед коллекция фильтровали это работало, но теперь я только хочу, чтобы результаты отфильтрованного массива категорий:

 let _query = { 
    '$or': [ 
    { 
     "name": { 
     "$regex": search, 
     "$options": "i" 
     } 
    }, 
    { 
     "category": { 
     "$regex": search, 
     "$options": "i" 
     } 
    } 
    ] 
}; 

Вот конкретный пример:

Если тип пользователя an он будет возвращать все записи, где name содержит an из категорий ["major olympian", "twelve titan", "primordial deity"], а также все записи из major olympian и twelve titan

Вот пример моего сбор с одной категории creature, который никогда отображается:

 { 
      "name": "Zeus", 
      "greekName": "Ζεύς, Zeus", 
      "romanName": "Jupiter", 
      "description": "King of the gods, ruler of Mount Olympus, and god of the sky, weather, thunder, lightning, law, order, and justice. He is the youngest son of Cronus and Rhea. He overthrew Cronus and gained the sovereignty of heaven for himself. In art he is depicted as a regal, mature man with a sturdy figure and dark beard. His usual attributes are the royal scepter and the lightning bolt. His sacred animals include the eagle and the bull. His Roman counterpart is Jupiter, also known as Jove.", 
    "category": "major olympian" 
      }, 
      { 
      "name": "Ophiogenean dragon", 
      "greekName": "", 
      "romanName": "", 
      "description": "a dragon that guarded Artemis' sacred grove in Mysia.", 
      "category": "creature", 
      }, 
      { 
      "greekName": "Ἀχλύς (Akhlýs)", 
      "name": "Achlys", 
      "description": "The goddess of poisons and the \"Death-Mist\", and    personification of misery and sadness. Said to have existed before Chaos itself.", 
      "category": "primordial deity", 
      "romanName": "" 
      } 
+1

Вы можете '$ и 'список категорий с существующим запросом' $ или'. Разве это не сработает? – Veeram

+0

ой! Я думаю, что он делает :) Спасибо! Я думаю, что понимаю, как работают эти запросы. –

+0

Вот в Simplied версии 'Const _query = { \t категория: { \t \t $ в: TEMP_CATEGORIES \t}, \t '$ или': [{ \t \t "имя": { \t \t \t«$ регулярное выражение ": поиск, \t \t \t "$ варианты": "я" \t \t} \t}, { \t \t" Катег ORY ": { \t \t \t "$ регулярное выражение": поиск, \t \t \t "$ варианты": "я" \t \t} \t}] };' – Veeram

ответ

1

Вы можете попробовать что-то вроде этого.

const _query = { 
    category: { 
     $in: TEMP_CATEGORIES 
    }, 
    '$or': [{ 
     "name": { 
      "$regex": search, 
      "$options": "i" 
     } 
    }, { 
     "category": { 
      "$regex": search, 
      "$options": "i" 
     } 
    }] 
}; 
+0

Выглядит много чище! –

0

Благодаря комментарию @Veeram мне удалось заставить его работать.

const TEMP_CATEGORIES = ["major olympian", "twelve titan", "primordial deity"];  
const _query = { 
      '$or': [ 
      { 
       $and: [ 
       { 
        "name": { 
        "$regex": search, 
        "$options": "i" 
        } 
       }, 
       { 
        category: { $in: TEMP_CATEGORIES } 
       } 
       ], 
      }, 
      { 
       $and: [ 
       { 
        "category": { 
        "$regex": search, 
        "$options": "i" 
        } 
       }, 
       { 
        category: { $in: TEMP_CATEGORIES } 
       } 
       ], 
      }, 
      ] 
     }; 


Greek 
     .find(_query) 
     .sort({ name: 1 }) 
     .exec((err, greeks) => { 
     if (err) { 
      console.warn(err); 
      reject(err) 
     } else { 
      resolve(greeks); 
     } 
     }); 
    }); 

Я не знаю, если это правильный путь, но это, кажется, работает. (Я предполагаю, что я должен модульное тестирование это ...)