Nano Hash - криптовалюты, майнинг, программирование

Самый простой способ отменить $all в mongoDB

Я запускаю следующий запрос на mongoDB 3.4, используя свое приложение. По сути, я хочу найти документы, элементы массива атрибутов которых соответствуют указанным критериям, используя $elemMatch.

db.collectionName.find({
    attributes: {
        $all: [{
            $elemMatch: {
                "name": "manufacturer",
                "value": "val1",
                "status": 1
            }
        }, {
            $elemMatch: {
                "name": "model",
                "value": "val2",
                "status": 1
            }
        }]
    }
})

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

Как я могу этого добиться?

Если возможно, я бы не стал менять массив, который я передаю на $all

16.11.2017

  • docs.mongodb.com/manual/reference/operator/query/not и теорема Де-Моргана, если требуется в вашем случае. 16.11.2017
  • Де-Морган требовал, чтобы я редактировал элементы массива, поэтому я пытался этого избежать. $not сработало, поэтому, если вы опубликуете ответ, я приму его сейчас. 16.11.2017
  • Не совсем понятно, какой случай вы пытаетесь представить, но $not в контексте, который, я думаю, вы имеете в виду, не требует каких-либо изменений в аргументах массива. Это просто отрицание, которое будет применяться перед $all в выражении запроса. Если только вы не имеете в виду что-то другое. Не могли бы сделать с образцом данных и ожидаемыми результатами. 16.11.2017
  • **$not** не стал бы. **De-Morgans** будет. 16.11.2017
  • Покажите образец. Если вы думаете, что $ne требуется для каждого элемента, то вы, вероятно, ошибаетесь. Вот почему я думаю, что вам действительно нужно опубликовать некоторые образцы данных и ожидаемый результат. Я вижу явный аргумент в пользу $not в том, что вы на самом деле имеете в виду. Но мои ожидаемые результаты могут отличаться от ожидаемых вами. Так развейте путаницу, покажите нам что-то, что мы можем воспроизвести. Это поможет вам получить правильный ответ, если вы это сделаете. 16.11.2017
  • @NeilLunn проверьте вторую часть ответа, который я только что опубликовал. Эта альтернатива потребовала бы $ne 16.11.2017
  • Чувак. Здесь действительно простая концепция. Вы фактически не демонстрируете никаких данных в вопросе или ожидаемом результате. Поэтому любой, кто просматривает это, просто увидит запрос без какого бы то ни было контекста. Так ваш ответ работает для вас? Возможно, делает. Но это просто бесполезно для всех, если они не могут ясно видеть, что должно было произойти и почему выражение работает или не работает. Контекст — это все, и без него вопрос и ответ просто бесполезны. Вот почему мой совет состоял в том, чтобы дать некоторый контекст. Кроме того, вы, вероятно, имеете в виду $nor, но все равно не понимаете. 16.11.2017

Ответы:


1

Используя оператор $not, предложенный @nullpointer в комментариях, я смог сделать это следующим образом:

db.collectionName.find({
    attributes: {
        $not: {
            $all: [{
                $elemMatch: {
                    "name": "manufacturer",
                    "value": "val1",
                    "status": 1
                }
            }, {
                $elemMatch: {
                    "name": "model",
                    "value": "val2",
                    "status": 1
                }
            }]
        }
    }
})

Другая альтернатива, которую я пытался избежать, но которую можно использовать, — это теоремы Де-Моргана, согласно которым:

НЕ (A AND B И C) = НЕ A ИЛИ НЕ B ИЛИ НЕ C, что сделало бы запрос

db.collectionName.find({
    attributes: {
        $or: [{
            $elemMatch: {
                "name": "manufacturer",
                "value": {"$ne": "val1"},
                "status": 1
            }
        }, {
            $elemMatch: {
                "name": "model",
                "value": {"$ne": "val2"},
                "status": 1
            }
        }]
    }

})
16.11.2017
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..