Я пытаюсь получить заголовок после использования агрегации и проекта, но по некоторым причинам он не отображается в моих результатах. Я задал еще один вопрос о том, как сортировать массив документов, и мне кажется, что я должен использовать агрегацию, чтобы выполнить то, что, на мой взгляд, было тривиальным упражнением. Я был неправ! Во всяком случае ... Я прокомментировал код, чтобы объяснить, что я пытаюсь сделать.
Product.aggregate([
{
$match: {
// get the passed in ID which is a string and needs to be converted to ObjectId format (is there a better way to do this?)
_id: new mongoose.Types.ObjectId(productId)
}
},
{
// deconstruct the array of objects
$unwind: "$requests"
},
{
// sort in required order of display
$sort: {
"requests.requestDt": -1
}
},
{
// group by the product ID and push into new array
$group: {
"_id": productId,
"requests": {
$push: "$requests"
}
}
},
{
// project the data I want to display in my view
$project: {
"_id": 1,
"title": 1,
"requests": 1,
}
}
])
Когда я консоль регистрирую это, я получаю вывод, подобный этому:
[{
"_id": "5c4aaa22d0f10e038999afca",
"requests": [{
"_id": "5c4b2925d47f6e0a79378010",
"userId": "5c25cddc73d10c02a75b3d55",
"firstName": "test",
"requestDt": "2019-01-25T15:20:05.410Z"
},
{
"_id": "5c4b28e8d47f6e0a7937800f",
"userId": "5c375260a6f58308e510711a",
"firstName": "Joe",
"requestDt": "2019-01-25T15:19:04.258Z"
}
]
}]
Итак, я получаю идентификатор продукта из _id в проекте, а также запросы, но без названия, и я не знаю почему?
Вот схема:
const productSchema = new Schema({
title: {
type: String,
required: true,
},
category: {
type: String,
required: true
},
images: [
{
name: {
type: String
}
}
],
description: {
type: String,
required: true
},
userId: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
},
createdAt: {
type: Date,
default: Date.now
},
requests: [
{
userId: { type: Schema.Types.ObjectId, required: true},
firstName: {type: String},
requestDt: {type: Date, default: Date.now}
}
]
});
UPDATE:
Я удалил $ group и теперь могу получить к ней доступ. Мои данные теперь выглядят так:
[{
"_id": "5c4aaa22d0f10e038999afca",
"title": "Some product",
"requests": {
"_id": "5c4b2925d47f6e0a79378010",
"userId": "5c25cddc73d10c02a75b3d55",
"firstName": "test",
"requestDt": "2019-01-25T15:20:05.410Z"
}
},
{
"_id": "5c4aaa22d0f10e038999afca",
"title": "Some product",
"requests": {
"_id": "5c4b28e8d47f6e0a7937800f",
"userId": "5c375260a6f58308e510711a",
"firstName": "Joe",
"requestDt": "2019-01-25T15:19:04.258Z"
}
}
]
Так что теперь все данные упакованы в массив, а не запросы. Но теперь у меня есть дубликаты данных: название продукта отображается дважды, но мне нужно только один раз.
Для доступа к заголовку я использую product[0].title
, а для запросов я помещаю их в цикл for, т. Е. Для (userRequest of product )
, и получаю доступ к таким данным, как: serRequest.requests.motivation
Это похоже на безумный длинный путь - просто сортировать по «запросам», поэтому, если у кого-то есть лучшее решение, пожалуйста, опубликуйте его