Запрос MongoDB для значения в поле с регулярным выражением с использованием Java

Я пытаюсь сделать запрос из своей коллекции документов, которая выглядит так:

{ "_id" : ObjectId("94"), "EmailAddress" :"[email protected]","Interests": "CZ1001,CE2004" }
{ "_id" : ObjectId("44"), "EmailAddress" :"[email protected]", "Interests":"CE1001,CE4002" }
{ "_id" : ObjectId("54"), "EmailAddress" :"[email protected]","Interests":"CE1001,CE2002" }

Примером является то, что я хочу получить адреса электронной почты, учитывая, что поле «Интересы» имеет то значение, которое я ищу.

Пример: если я ищу CZ1001, я получу данные об адресе электронной почты Obj 1.

Если я буду искать CE1001, я получу данные об адресах электронной почты Obj 2 и Obj 3.

Идентификатор объекта создается уникальным образом, когда я вставляю записи в начале, если это помогает.

Я могу получить объекты в оболочке MongoDB, используя

db.users.find(Module: {"$regex": "CE1001"}})

Требуются только адреса электронной почты.

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

Document doc = (Document) collection.find(new BasicDBObject("Module", {"$regex":"CE1001"})) .projection(Projections.fields(Projections.include("EmailAddress"), Projections.excludeId())).first(); 

Где new BasicDBObject("Module", {"$regex":"CE1001"}) не допускается.

new BasicDBObject("Module", String_variable) допускается

нельзя ли хранить Interests в виде массива?

Ayush Gupta 16.10.2018 19:03

Это проект, который ранее выполнялся другими, я не могу контролировать, как он хранился при запуске. Так что я не могу этого сделать.

Jeremy Wong 16.10.2018 19:07

Что вы имеете в виду под "в java"? Вы загружаете все документы и хотите отфильтровать результаты? Что у вас есть на данный момент?

Joel 16.10.2018 19:14

Как и в Java, я хочу получить эти электронные письма и оттуда отправлять уведомления об этих письмах. Я могу получить объекты в оболочке MongoDB с помощью db.users.find (Module: {"$ regex": "CE1001"}})

Jeremy Wong 16.10.2018 19:18

Если вы можете поместить объект в оболочку, то в чем проблема?

Ayush Gupta 16.10.2018 19:23

Если вы используете mongo-java-driver, в QueryBuilder есть метод regex: mongodb.github.io/mongo-java-driver/3.8/javadoc/index.html?c‌ om /…

Joel 16.10.2018 19:32

mongodb java не позволяет получить доступ к collection.find таким образом. Document doc = (Document) collection.find (new BasicDBObject ("Module", {"$ regex": "CE1001"})) .projection (Projection.fields (Projection.include ("EmailAdd‌ ress"), Projection.excludeId ())).первый(); new BasicDBObject ("Модуль", {"$ regex": "CE1001"}) не допускается. Однако новый BasicDBObject ("Модуль", String_variable) разрешен

Jeremy Wong 16.10.2018 19:34

Попробуйте new BasicDBObject("Module", new BasicDBObject("$regex", "CE1001"))

s7vr 16.10.2018 19:51

Попробуйте doc.getString("EmailAddress")

s7vr 16.10.2018 20:07

@Veeram Спасибо! Это тоже только что обнаружил. Однако я смог получить только 1 запись, так как я использую .first () в конце поиска коллекции. Есть ли способ повторить, как цикл for, для проверки всех записей, чтобы увидеть, есть ли еще записи, подходящие для «CE1001»? Если я удалю .first (), появится сообщение об ошибке.

Jeremy Wong 16.10.2018 20:15

Попробуйте FindIterable<Document> results= collection.find.. for(Document doc : results) { ... }

s7vr 16.10.2018 20:25

@Veeram FindIterable <Document> results = collection.find (новый BasicDBObject ("Module", новый BasicDBObject ("$ regex", "CE1001"))). Projection (Projection.fi‌ elds (Projection.inc‌ lude ("EmailAddress ") ‌, Projection.excludeId ())). First (); Выдает ошибку «Документ не может быть преобразован в FindIterable <Document>. Поэтому я попробовал FindIterable <Document> results = (FindIterable <Document>) collection.find, но при компиляции я получаю следующую ошибку:« Исключение в потоке «main» java. lang.ClassCastException: org.bson.Document нельзя преобразовать в com.mongodb.client.FindIterable "

Jeremy Wong 16.10.2018 20:41

Вы хотите все? не используйте сначала

s7vr 16.10.2018 20:42

@Veeram Вау, вот почему это не сработало !! Спасибо вам за помощь!!

Jeremy Wong 16.10.2018 20:46

Возможный дубликат Регулярное выражение с оператором OR в Java - mongoDB

dnickless 16.10.2018 22:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
15
69
2

Ответы 2

Для конкретного Interest ваш запрос mongoDB будет выглядеть (на примере CE1001):

db.collection.find({
  $or: [
    {
      Interests: {
        $regex: "^CE1001,"
      }
    },
    {
      Interests: {
        $regex: ",CE1001,"
      }
    },
    {
      Interests: {
        $regex: ",CE1001$"
      }
    }
  ]
},
{
  "EmailAddress": 1
})

Для тех, кто случайно зашел на этот пост. Ниже приведены рабочие коды. Кредиты для @Veeram.

FindIterable <Document> results = collection.find(new BasicDBObject("Module", new BasicDBObject("$regex", "CE1001")) .projection(Projections.fields(Projections.include("EmailAddress"), Projections.excludeId()));

for(Document doc : results) {
doc.getString("EmailAddress")
 }

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