группа мангусты со вложенными свойствами - PullRequest
0 голосов
/ 08 октября 2018

Я пытался что-то с событиями и должен был запустить группу по запросу, но я не мог пройти через это, потому что это было в основном на поддокументе.

Вот моя БД в настоящее время:

{ 
"_id" : ObjectId("5bbb6e1c7f3fc62db401d05a"), 
"type" : "ADD_BOOK", 
"metadata" : {
    "_id" : ObjectId("5bbb6e1c7f3fc62db401d05b"), 
    "name" : "ad", 
    "author" : "ad", 
    "imgUrl" : "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
}, 
"timestamp" : 1539010076240.0, 
"__v" : NumberInt(0)
},
{ 
"_id" : ObjectId("5bbb736ad441d505589ccecc"), 
"type" : "ADD_BOOK", 
"metadata" : {
    "_id" : ObjectId("5bbb736ad441d505589ccecb"), 
    "name" : "ada", 
    "author" : "ada", 
    "imgUrl" : "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
}, 
"timestamp" : 1539011434826.0, 
"__v" : NumberInt(0)
},
{ 
"_id" : ObjectId("5bbb7373d441d505589ccecd"), 
"type" : "DELETE_BOOK", 
"metadata" : {
    "_id" : "5bbb736ad441d505589ccecb"
}, 
"timestamp" : 1539011443792.0, 
"__v" : NumberInt(0)
}

и я хочу, чтобы вывод был таким:

[
  {
    "_id": ObjectId("5bbb736ad441d505589ccecb"),
    "books": [
        {
            "type": "ADD_BOOK",
            "metadata": {
                "_id": ObjectId("5bbb736ad441d505589ccecb"),
                "name": "ada",
                "author": "ada",
                "imgUrl": "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
            }
        }
        {
            "type": "DELETE_BOOK",
            "metadata": {
              "_id": ObjectId("5bbb736ad441d505589ccecb")
            }
        }
    ]
  },
  {
    "_id": ObjectId("5bbb6e1c7f3fc62db401d05b"),
    "books": [
        {
            "type": "ADD_BOOK",
            "metadata": {
                "_id": ObjectId("5bbb6e1c7f3fc62db401d05b"),
                "name": "ad",
                "author": "ad",
                "imgUrl": "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
            }
        }
    ]
  }
]

Моя текущая реализация пытается что-то вроде этого:

db.bookevents.aggregate([
    { $match: { }},
    { $group: { _id: "$metadata._id", books: { $push: "$$ROOT" } } }
])

Это не работает, как ожидалось.Я пытаюсь прочитать документацию, но пока не могу разобраться с этим.

Возможно ли, что решение этой проблемы - что-то другое, а не $group?Также можем ли мы поставить $sort на отметку времени для каждого books[]?

PS Я знаю, что вопрос в основном кодовый, но я не знаю, как его поставить другим способом.

1 Ответ

0 голосов
/ 08 октября 2018

Вы получаете 3 групп вместо ожидаемых 2, потому что metadata._id для DELETE_BOOK имеет тип string , тогда как все остальные имеют тип ObjectId .Вы должны исправить это вручную или, если можете использовать MongoDB 4.0, тогда вы можете использовать оператор $ toObjectId для преобразования этого значения до $group.Кроме того, вы можете применить $sort перед группировкой и избавиться от ненужных полей, используя $project.Попробуйте:

db.bookevents.aggregate([
    { $addFields: { "metadata._id": { $toObjectId: "$metadata._id" } } }, // or fix manually
    { $sort: { timestamp: 1 } },
    { $group: { _id: "$metadata._id", books: { $push: "$$ROOT" } } },
    { $project: { "books.timestamp": 0, "books.value": 0, "books.__v": 0 } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...