Как искать запись в mongodb без упоминания названия поля? - PullRequest
0 голосов
/ 06 июля 2018

Я ищу запрос в mongodb, который удовлетворит мое условие поиска. У меня есть запись в коллекции БД:

{
 "_id": ObjectId("5b3d970398e9d099427896c3"),
 "role": "New Booking is there by abc",
 "date": "07/04/2018",
 "idaddress": "213.123.123.213",
 "booking": {
   "bedroom": 4,
   "bathroom": 6,
   "customer": "abc",
   "email": "abc@gmail.com",
   "provider": "provider1",
   "address": "brazil",
   "appt": "123456",
   "phone": "987654321"
 }
}

В этой записи booking объект имеет 8 полей и для поиска я использую запрос:

db.collection_name.find({ "booking.field_name" : {$regex : /data$/}})

Чтобы найти значение, соответствующее каждому полю (клиент, электронная почта, поставщик, адрес, приложение, телефон), мне нужно написать одну и ту же строку с именем поля, но если у меня есть 100 полей под объектом бронирования, тогда мне нужно написать одну и ту же строку 100 раз с каждым именем поля. Я ищу запрос, который ищет в каждом поле, для этого я пробовал условие $ text, например: bson.M {"_ id": bson.M {'$ type': "objectId"}} Но условие $ text будет выполнять поиск только по полному слову, а не по слову с регулярным выражением. Пример: - "This is a string" в этой строке я хочу выполнить поиск по слову "str", но не будет отображаться соответствующая запись с ним.

Кто-нибудь предложит какой-нибудь пример для этого. Это займет у меня много времени.

За помощь в решении этой проблемы. Спасибо.

1 Ответ

0 голосов
/ 06 июля 2018

Структура агрегации это путь. Как сказал @Prajval, у вас есть объект, поэтому решение - преобразовать его в массив перед запросом. Вот код:

db.test1.aggregate(
    [
        {
            $project: {
                role:1,
                date:1,
                idadress:1,
                booking_values:{$objectToArray:"$booking"}
            }
        },
    ]
);

Это выдаст

{ 
    "_id" : ObjectId("5b3d970398e9d099427896c3"), 
    "role" : "New Booking is there by abc", 
    "date" : "07/04/2018", 
    "booking_values" : [
        {
            "k" : "bedroom", 
            "v" : NumberInt(4)
        }, 
        {
            "k" : "bathroom", 
            "v" : NumberInt(6)
        }, 
        {
            "k" : "customer", 
            "v" : "abc"
        }, 
        {
            "k" : "email", 
            "v" : "abc@gmail.com"
        }, 
        {
            "k" : "provider", 
            "v" : "provider1"
        }, 
        {
            "k" : "address", 
            "v" : "brazil"
        }, 
        {
            "k" : "appt", 
            "v" : "123456"
        }, 
        {
            "k" : "phone", 
            "v" : "987654321"
        }
    ]
}

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

Если вам нужна помощь для достижения этого, просто укажите ожидаемый результат.

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