Как сделать запрос "$ and" и "$ or" вместе в MongoDB? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть коллекция MongoDB, и мои запросы, как показано ниже

Это работает: (Возвращается только с frequency:1 записями)

http://localhost:3000/words?frequency=1

Это работает: (Возвращается только с difficulty:2 записями)

http://localhost:3000/words?difficulty=2

Это работает, но не то, что я хочу

http://localhost:3000/words?frequency=1&difficulty=2

Этот запрос не возвращается, так как имеет frequency=1 и difficulty=2 значений. Но я хочу получить только 1019 frequency=1, difficulty=2 значения.

Этот запрос должен возвращать только "word":"first", но возвращается с "word":"first" и "word":"fourth"

Образец коллекции MongoDB:

{
    "word": "first",
    "frequency": 1,
    "difficulty": 2
},
{
    "word": "second",
    "frequency": 1,
    "difficulty": 1
},
{
    "word": "third",
    "frequency": 2,
    "difficulty": 1
},
{
    "word": "fourth",
    "frequency": 2,
    "difficulty": 2
},

И это мой запрос:

const difficulty = req.query.difficulty;
const frequency = req.query.frequency;
Words.find( { $or: [ { difficulty: difficulty }, { frequency: frequency }, { $and: [ { difficulty: difficulty }, { frequency: frequency } ] } ] } )

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

Решено: Решено с условиями

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы смешиваете запрос в одном операторе $ или.

Чтобы вернуть записи с частотой = 1, сложностью = 2, вы должны использовать $ и оператор.

И в соответствии с документацией MongoDB он обеспечивает неявную операцию AND при указании списка выражений через запятую. Таким образом, вы можете напрямую использовать:

Words.find({
   frequency: 1,
   difficulty: 2
});

Но для И запросов с несколькими выражениями, указывающими один и тот же оператор , см. Документы MongoDB

0 голосов
/ 29 июня 2018

Я хочу только получить, имеет обе частоты = 1, сложность = 2 значения

Ваш запрос не будет работать должным образом, потому что вы задали все опции в $ или и $ и в условиях. Таким образом, даже если вы отправляете разные параметры в вызове API, он будет проверяться следующим образом: например:

Для: http://localhost:3000/words?frequency=1&difficulty=2

Ваш запрос будет:

Words.find( { $or: [ { difficulty: 2 }, { frequency: 1 }, { $and: [ { difficulty: 2 }, { frequency: 1 } ] } ] } )

Который ищет - либо {сложность: 2} - или {частота: 1} - или {сложность: 2} и {частота: 1}

Вот почему вы получаете результаты микса.

Вот что вы можете сделать ...

проверяет параметры запроса в контроллере и на основании этого отправляет различные запросы в БД и получает точные данные.

например,

Для: http://localhost:3000/words?frequency=1&difficulty=2

Попробуйте это:

db.collection.find({
  $and: [
    {
      frequency: 1
    },
    {
      difficulty: 2
    }
  ]
});

и для

http://localhost:3000/words?frequency=1

http://localhost:3000/words?difficulty=2

db.collection.find( { $or: [ { difficulty: difficulty }, { frequency: frequency } ] } )

Вот пример: https://mongoplayground.net/p/DmdxOx6wc8K

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...