как запросить mongodb, когда вы перечисляете значения

#mongodb #nosql

Вопрос:

Я пытаюсь найти запрос mongodb для приведенного ниже документа. Найдите все документы, в которых есть этот идентификатор guid 360DC2AE-2B67-4E8D-E320-71D0D30D90F7, но идентификатор guid может быть в 1-м узле или любом узле в списках контактов.значения.

Приведенный ниже пример запроса не работает, когда идентификатор guid находится во 2-м или 5-м узле.

бд.Контакты.найти( {

     "Tags.Entries.ContactLists.Values.0.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}"
}
 

)

 { 
"_id" : BinData(3, "ZLz5ddW2pUCpYg4R 8XWgA=="), 
"Identifiers" : {
    "IdentificationLevel" : NumberInt(2), 
    "Identifier" : "user1@gmail.com"
}, 
"Personal" : {
    "FirstName" : "user1", 
    "Surname" : "user1"
}, 
"Emails" : {
    "Preferred" : "Preferred", 
    "Entries" : {
        "Preferred" : {
            "SmtpAddress" : "user1@gmail.com"
        }
    }
}, 
"Lease" : null, 
"Tags" : {
    "Entries" : {
        "ContactLists" : {
            "Values" : {
                "0" : {
                    "Value" : "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}", 
                    "DateTime" : ISODate("2021-10-08T21:42:30.731 0000")
                }, 
                "1" : {
                    "Value" : "{4D90C25F-F0BE-47C0-EB6E-CA799B25E91B}", 
                    "DateTime" : ISODate("2021-10-08T21:52:04.355 0000")
                }, 
                "2" : {
                    "Value" : "{6DC40CA8-AC78-404C-C5D3-1E868E1D8EB4}", 
                    "DateTime" : ISODate("2021-10-08T21:52:26.156 0000")
                }
            }
        }
    }
}
 

}

Ответ №1:

Простое решение-использование агрегаций

  • Создайте объекты в массив с помощью $objectToArray
  • Проверьте, имеет ли он значение, используя $match

вот код

 db.collection.aggregate([
  {
    $addFields: {
      "objToArray": {
        "$objectToArray": "$Tags.Entries.ContactLists.Values"
      }
    }
  },
  {
    "$match": {
      "objToArray.v.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}"
    }
  },
  {
    $project: {
      objToArray: 0
    }
  }
])
 

Рабочая игровая площадка Монго

Комментарии:

1. это не работает, пожалуйста, проверьте этот образец mongoplayground.net/p/aVRIb7TfLtg

2. Это работает. Вы не передаете документы в формате corect. Проверьте мой ответ,я выложил демо. Или вы можете напрямую зарегистрироваться в mongodb

3. варман, спасибо, что по какой-то причине он работает в mongodb, а не в mongoplayground. Единственная последняя проблема, которую я вижу, идентификатор электронной почты-это уникальный идентификатор, и в коллекции нет дубликатов документов, но я получаю дубликаты записей, в любом случае мы можем добавить отдельные ?

4. ДА. Мы можем. Но опубликуйте свой документ в mongo playground, удалите ненужные поля и покажите мне, каков ожидаемый результат

Ответ №2:

если ваш values массив, используйте $

 "Tags.Entries.ContactLists.Values.$.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}"
 

Если это встроенный документ, вы можете только перечислить все.

Может быть, вы можете попробовать перечислить до 100 пунктов.

 "Tags.Entries.ContactLists.Values.0.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}",
"Tags.Entries.ContactLists.Values.1.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}",
"Tags.Entries.ContactLists.Values.2.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}",
"Tags.Entries.ContactLists.Values.3.Value": "{360DC2AE-2B67-4E8D-E320-71D0D30D90F7}"
 

Комментарии:

1. На самом деле это не массив, и это встроенный документ, пожалуйста, смотрите полный документ в базе данных. Контакты.найти({}, {«Теги. Записи. Контактеры. Значения.$.Значение»: «{4D90C25F-F0BE-47C0-EB6E-CA799B25E91B}»}) не работал с запросом об ошибке, не удалось выполнить запрос с кодом ошибки 2 и тегами сообщения об ошибке «Позиционная проекция». Записи. Контактеры. Значения.$.Значение » не соответствует документу запроса.

2. db.Контакты.найти({}, {«Теги. Записи. Контактеры. Значения.0.Значение»: «{4D90C25F-F0BE-47C0-EB6E-CA799B25E91B}»}) использование этого работает, но оно извлекает только элементы, имеющие это значение в 0-й позиции, но не в том случае, если это 1-я или 2-я позиция.

3. на самом деле это не означает 0th position , что это обычный вызов имени поля 0 в вашей структуре, я думаю, что вы неправильно сохраняете свои данные, и это очень затруднит ваш запрос.

4. Значения могут иметь до 8000 узлов, поэтому перечислять 8000 раз в запросе невозможно, и я не могу изменить структуру, она основана на продукте и исходит из программного обеспечения. Любая помощь, такая как дикая карта или содержит и т. Д., И у нас есть 6 миллионов объектов