#mongodb
#mongodb
Вопрос:
У меня есть коллекция mongodb с такими данными, как:
{
"_id" : "100",
"deleted" : false,
"alphanumericKey" : "s",
"sortName" : "stackoverflow",
"name" : [
{
"value" : "Stack Overflow",
"language" : "en"
}
]
}
{
"_id" : "101",
"deleted" : false,
"alphanumericKey" : "s",
"sortName" : "something",
"name" : [
{
"value" : "Something else with s",
"language" : "en"
}
]
}
{
"_id" : "103",
"deleted" : false,
"alphanumericKey" : "x",
"sortName" : "xerox",
"name" : [
{
"value" : "Xerox",
"language" : "en"
}
]
}
Теперь мне нужно запустить запрос, который сгруппировал бы результаты по буквенно-цифровому значению каждого элемента и отобразил весь объект под этим новым ключом. Также не помешало бы, если бы они были отсортированы в алфавитном порядке, но это приятно иметь… В любом случае в итоге будет выглядеть примерно так:
{
"s": [{
"_id": "101",
"deleted": false,
"alphanumericKey": "s",
"sortName": "something",
"name": [{
"value": "Something else with s",
"language": "en"
}]
},
{
"_id": "100",
"deleted": false,
"alphanumericKey": "s",
"sortName": "stackoverflow",
"name": [{
"value": "Stack Overflow",
"language": "en"
}]
}
]
}
{
x: [{
"_id": "103",
"deleted": false,
"alphanumericKey": "x",
"sortName": "xerox",
"name": [{
"value": "Xerox",
"language": "en"
}]
}]
}
Комментарии:
1. Что вы пробовали и какую часть вы не понимаете? Пожалуйста, покажите свою попытку кода в вопросе.
2. db.getCollection(‘service’).aggregate([{$group: {_id:{$substr: [‘$sortName’, 0, 1]}}}]) однако это только группирует через «sortName», и я не могу заставить его отображать остальные поля
3.
$push
Ответ №1:
Хитрость заключается в том, чтобы выполнить этап $ group с $$ ROOT. Вот ответ :
db.collection.aggregate([
{
$group: {
_id: "$alphanumericKey",
docs: {
$push: "$$ROOT"
}
},
},
{
$sort: {
_id: 1
}
}
])
Вернет
[
{
"_id": "s",
"docs": [
{
"_id": "100",
"alphanumericKey": "s",
"deleted": false,
"name": [
{
"language": "en",
"value": "Stack Overflow"
}
],
"sortName": "stackoverflow"
},
{
"_id": "101",
"alphanumericKey": "s",
"deleted": false,
"name": [
{
"language": "en",
"value": "Something else with s"
}
],
"sortName": "something"
}
]
},
{
"_id": "x",
"docs": [
{
"_id": "103",
"alphanumericKey": "x",
"deleted": false,
"name": [
{
"language": "en",
"value": "Xerox"
}
],
"sortName": "xerox"
}
]
}
]
РЕДАКТИРОВАТЬ: Для тех, кто не может использовать $$ ROOT (до версии 2.6), вам необходимо описать весь наш документ на этапе накопления $ group, например :
db.collection.aggregate([
{
$group: {
_id: "$alphanumericKey",
docs: {
$push: {
"_id": "$_id",
"alphanumericKey": "$alphanumericKey",
"deleted": "$deleted",
"name": "$name",
"sortName": "$sortName"
}
}
},
},
{
$sort: {
_id: 1
}
}
])
Комментарии:
1. Прошу прощения. Я забыл упомянуть: Монго версии 2.4.14. И я вроде как застрял в этой версии. Это приведет к появлению ошибки: «errmsg»: «исключение: имена полей FieldPath могут не начинаться с ‘$'».,