У меня есть коллекция "учетные записи", которая содержит документы, похожие на эту структуру:
{
"email" : "[email protected]",
"groups" : [
{
"name" : "group1",
"contacts" : [
{ "localId" : "c1", "address" : "some address 1" },
{ "localId" : "c2", "address" : "some address 2" },
{ "localId" : "c3", "address" : "some address 3" }
]
},
{
"name" : "group2",
"contacts" : [
{ "localId" : "c1", "address" : "some address 1" },
{ "localId" : "c3", "address" : "some address 3" }
]
}
]
}
Через
q = { "email" : "[email protected]", "groups" : { $elemMatch: { "name" : "group1" } } }
p = { "groups.name" : 0, "groups" : { $elemMatch: { "name" : "group1" } } }
db.accounts.find( q, p ).pretty()
Я получу только группу указанной учетной записи, которая меня интересует.
Вопрос: Как я могу получить ограниченный список "контактов" в определенной "группе" указанной "учетной записи"? Предположим, что у меня есть следующие аргументы:
- : электронная почта - "[email protected]"
- group: name - "group1"
- contact: массив localIds - [ "c1", "c3", "Not existing id" ]
Учитывая эти аргументы, я хотел бы получить следующий результат:
{
"groups" : [
{
"name" : "group1", (might be omitted)
"contacts" : [
{ "localId" : "c1", "address" : "some address 1" },
{ "localId" : "c3", "address" : "some address 3" }
]
}
]
}
Мне не нужно ничего другого, кроме результирующих контактов.
Подходы
Для простоты все запросы пытаются получить только один подходящий контакт вместо списка соответствующих контактов. Я пробовал следующие запросы без каких-либо успехов:
p = { "groups.name" : 0, "groups" : { $elemMatch: { "name" : "group1", "contacts" : { $elemMatch: { "localId" : "c1" } } } } }
p = { "groups.name" : 0, "groups" : { $elemMatch: { "name" : "group1", "contacts.localId" : "c1" } } }
not working: returns whole array or nothing depending on localId
p = { "groups.$" : { $elemMatch: { "localId" : "c1" } } }
error: {
"$err" : "Can't canonicalize query: BadValue Cannot use $elemMatch projection on a nested field.",
"code" : 17287
}
p = { "groups.contacts" : { $elemMatch: { "localId" : "c1" } } }
error: {
"$err" : "Can't canonicalize query: BadValue Cannot use $elemMatch projection on a nested field.",
"code" : 17287
}
Любая помощь приветствуется!