#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 миллионов объектов