У меня проблема с написанием запроса для получения данных из моей структуры. Я должен сделать запрос, используя несколько критериев. Мои критерии: идентификатор, срок, цена, темы. Например, запросить мою структуру, используя:
Критерии:
id: [ObjectId("234434")]
term: "24"
price: 80 // return only this data that have price lower than 80
topics: ["topic1", "topic2", "topic3"]
Это моя сокращенная и упрощенная структура базы данных:
{
"_id":{
"$oid":"234434"
},
"name":"name1",
"posts":[
{
"name":"post1",
"price":{
"$numberDouble":"17.5"
},
"term":"24",
"topics":[
{
"name":"topic1",
"desc":"desc"
},
{
"name":"topic23423",
"desc":"desc"
}
],
"extraPosts":[
{
"name":"extra post 1",
"description":"desc extra ",
"topics":[
{
"name":"topic2",
"desc":"desc"
},
{
"name":"topic566566",
"desc":"desc"
}
]
},
{
"name":"extra post 2",
"description":"desc extra ",
"topics":[
{
"name":"topic3",
"desc":"desc"
},
{
"name":"topic56656566",
"desc":"desc"
}
]
},
{
"name":"extra post 3",
"description":"desc extra ",
"topics":[
{
"name":"topic4324",
"desc":"desc"
},
{
"name":"topic56623456566",
"desc":"desc"
}
]
}
]
}
]
}
Запрос должен вернуть все сообщения с темами поиска, если сообщений нет, выполнить поиск по дополнительным сообщениям и вернуть основные и дополнительные сообщения, содержащие темы поиска. Поэтому сначала ограничьте структуру, отфильтровав ее по идентификатору, затем по термину, затем по цене и, наконец, по темам. Так что в этом случае он должен вернуть:
{
"_id":{
"$oid":"234434"
},
"name":"name1",
"posts":[
{
"name":"post1",
"price":{
"$numberDouble":"17.5"
},
"term":"24",
"topics":[
{
"name":"topic1",
"desc":"desc"
},
{
"name":"topic23423",
"desc":"desc"
}
],
"extraPosts":[
{
"name":"extra post 1",
"description":"desc extra ",
"topics":[
{
"name":"topic2",
"desc":"desc"
},
{
"name":"topic566566",
"desc":"desc"
}
]
},
{
"name":"extra post 2",
"description":"desc extra ",
"topics":[
{
"name":"topic3",
"desc":"desc"
},
{
"name":"topic56656566",
"desc":"desc"
}
]
}
]
}
]
}
Поскольку пост1 имеет тему1 и все искомые темы в extraPosts: дополнительный пост 1, дополнительный пост 2. Он не должен возвращаться в пост1, дополнительный пост с именем: дополнительный пост 3, поскольку он не содержит одного из найденных topi c. Если все темы не в сообщении, а в его дополнительных сообщениях, то не возвращайте это сообщение. Если бы все топки были в дополнительном посте 1 и дополнительном посте 1, а в посте 1 не было бы искомых топи c, он также должен вернуть post1 с extraPosts: дополнительный пост 1, дополнительный пост 2. В моей реальной структуре есть много объектов с идентификатором и много сообщений.