Невозможно получить определенное значение в БД, используя $ project - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь получить заголовок после использования агрегации и проекта, но по некоторым причинам он не отображается в моих результатах. Я задал еще один вопрос о том, как сортировать массив документов, и мне кажется, что я должен использовать агрегацию, чтобы выполнить то, что, на мой взгляд, было тривиальным упражнением. Я был неправ! Во всяком случае ... Я прокомментировал код, чтобы объяснить, что я пытаюсь сделать.

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

Это похоже на безумный длинный путь - просто сортировать по «запросам», поэтому, если у кого-то есть лучшее решение, пожалуйста, опубликуйте его

1 Ответ

0 голосов
/ 26 января 2019

Для получения значения title в $group stage

вам нужно использовать $first агрегацию
Product.aggregate([
  { "$match": { "_id": new mongoose.Types.ObjectId(productId) }},
  { "$unwind": "$requests" },
  { "$sort": { "requests.requestDt": -1 }},
  { "$group": {
    "_id": "$_id",
    "requests": { "$push": "$requests" },
    "title": { "$first": "$title" }
  }},
  { "$project": { "_id": 1, "title": 1, "requests": 1 }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...