Это вопрос о наилучшем способе добавления серии данных в массив, где мне нужно сопоставить другой элемент. Я пытаюсь использовать фреймворк 2.2 Aggregation, и я могу сделать это с помощью простой группы.
Итак, для заданного набора документов я пытаюсь получить такой вывод:
{
"result" : [
{
"_id" : null,
"numberOf": 2,
"Sales" : 468000,
"profit" : 246246,
}
],
"ok" : 1
}
Теперь у меня изначально был список документов, содержащих значения, присвоенные именованным свойствам, например:
[
{
_id : 1,
finance: {
sales: 234000,
profit: 123123,
}
}
,
{
_id : 2,
finance: {
sales: 234000,
profit: 123123,
}
}
]
Это было достаточно легко добавить, но структура не работала по другим причинам. Например, есть и другие столбцы, такие как "финансы", и я хочу иметь возможность индексировать их, не создавая тысячи индексов, поэтому мне нужно преобразовать их в такую структуру:
[
{
_id : 1,
finance: [
{
"k": "sales",
"v": {
"description":"sales over the year",
v: 234000,
}
},
{
"k": "profit",
"v": {
"description":"money made from sales",
v: 123123,
}
}
]
}
,
{
_id : 2,
finance: [
{
"k": "sales",
"v": {
"description":"sales over the year",
v: 234000,
}
},
{
"k": "profit",
"v": {
"description": "money made from sales",
v: 123123,
}
}
]
}
]
Я могу индексировать finance.k, если захочу, но тогда я изо всех сил пытаюсь собрать сводный запрос, чтобы скомпоновать все числа, соответствующие определенному ключу. Именно по этой причине я изначально пошел на именованные свойства, но это действительно нужно работать в ситуации, когда есть тысячи ярлыков "k".
Кто-нибудь знает, как построить общий запрос для этого, используя новую структуру? Я пробовал это,
db.projects.aggregate([
{
$match: {
// QUERY
$and: [
// main query
{},
]
}
},
{
$group: {
_id: null,
"numberOf": { $sum: 1 },
"sales": { $sum: "$finance.v.v" },
"profit": { $sum: "$finance.v.v" },
}
},
])
но я получаю;
{
"errmsg" : "exception: can't convert from BSON type Array to double",
"code" : 16005,
"ok" : 0
}
** Для получения дополнительной наград я должен буду иметь возможность сделать это и в запросе MapReduce.