Пара динамических значений ключа найдена в MongoDB

Я столкнулся с проблемой поиска динамических пар ключ-значение с использованием метода .find в mongoDB. вот мой массив объектов, пары ключ-значение которых можно увеличить...

[ 
    {
        "key" : "dynamicKey1",
        "value": "dynamicValue1"
    },
    {
        "key" : "dynamicKey2",
        "value": "dynamicValu2"
    },
...

]

Я хочу получить результат таким образом, чтобы он удовлетворял всем условиям пары ключ-значение. Что-то вроде поиска всех документов из коллекции, удовлетворяющей этим условиям.

Итак, мой API таков:

app.post('/search/:name',  (req, res) => {

const collectionName = req.params.name;
  async.eachSeries(req.body, (item, callback) => {
  
    const database = client.db("databaseName");
    const result = database.collection(collectionName).find({ [item.key]: item.value }).toArray();
    result.then((doc) => {
    res.json(doc)
      })
    callback();
  });
});

результат возвращает два или более промисов, но мне нужны только те документы, которые удовлетворяют всем .find запросам в качестве результата.

Как мне решить эту проблему?

Спасибо

Вот изображение POST-запроса Insomnia: Insomnia

Не могли бы вы объяснить, что на самом деле вы пытаетесь сделать, запрос и еще немного вернуть только один документ?

kgangadhar 09.12.2020 22:17

@kgangadhar да, поэтому у меня есть массив объектов с ключами и значениями, ключи и значения могут быть разными при каждом вызове API. поэтому мне нужно получить только те документы из коллекции, которые удовлетворяют всем условиям ключевого значения. поэтому приведенный выше API запускается для каждого объекта пары значений ключа и возвращает объединение всех методов .find. Я хотел бы иметь только один результат, который удовлетворяет всем условиям пар ключ-значение, проще говоря, пересечение всех запросов. Я пробовал агрегат, но не знаю, как его правильно написать.

Mohammadreza Arabameri 09.12.2020 22:27

Пожалуйста, проверьте изображение, которое я добавил к сообщению

Mohammadreza Arabameri 09.12.2020 23:04

Я рекомендую MongoDB Atlas Search с подстановочными путями. Это намного проще, многофункциональнее и быстрее docs.atlas.mongodb.com/reference/atlas-search/…

Nice-Guy 11.12.2020 08:54

@ Nice-Guy Я проверил это. Это также полезно. Спасибо :)

Mohammadreza Arabameri 13.12.2020 12:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
1 646
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе предоставленного вами изображения ваши данные имеют следующий формат в базе данных:

[
    {
        "_id": "1",
        "region": "Auckland",
        "anzsic_descriptor":"Agriculture",
        "gas": "carbon diaoxide equivalents",
        "units":"kilotonnes",
        "magnitude":"carbon diaoxide equivalents",
        "year": "2011",
        "data_val": "764.3"
    },
    {
        "_id": "2",
        "region": "Canterbury",
        "anzsic_descriptor":"Agriculture",
        "gas": "carbon diaoxide equivalents",
        "units":"kilotonnes",
        "magnitude":"carbon diaoxide equivalents",
        "year": "2011",
        "data_val": "6823.16"
    },
    {
        "_id": "3",
        "region": "Bay of Plenty",
        "anzsic_descriptor":"Agriculture",
        "gas": "carbon diaoxide equivalents",
        "units":"kilotonnes",
        "magnitude":"carbon diaoxide equivalents",
        "year": "2011",
        "data_val": "1477.94"
    }
   ...........
]

/search/:name получает тело, которое представляет собой массив в следующем формате:

[{
    "key": "year",
    "value": "2011"
}, {
    "key": "data_val",
    "value": "764.3"
}]

Вам нужно использовать генерацию запроса следующим образом, чтобы сначала сгенерировать запрос перед запросом БД:

const generateQuery = (arr) => {
    return arr.reduce((result, item) => {
        const {key, value } = item;
        result[key] = value;
        return result;
    }, {});
};

console.info(generateQuery([{"key": "year","value": "2011"},{"key": "data_val","value": "764.3"}]))

Запрос к БД для сгенерированного запроса выглядит так: mongo player.

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

const generateQuery = (arr) => {
    return arr.reduce((result, item) => {
        const { key, value } = item;
        result[key] = value;
        return result;
    }, {});
};


app.post('/search/:name', (req, res) => {
    return new Promise((resolve, reject) => {
        const collectionName = req.params.name;
        const queryArry = req.body // [{"key": "year","value": "2011"},{"key": "data_val","value": "764.3"}]
        const query = generateQuery(queryArry);
        const database = client.db("databaseName");
        database.collection(collectionName).find(query).then(result => {
            return resolve(result);
        }).catch(e => {
            reject(e);
        });
    }).catch(e => {
        reject(e);
    })
});

Правильно, спасибо за помощь :)

Mohammadreza Arabameri 10.12.2020 14:09

Другие вопросы по теме