Пн goose запрос на группировку по дате - PullRequest
2 голосов
/ 11 июля 2020

Я новичок в агрегации mon goose, и у меня есть коллекция в формате ниже

Документы коллекции:

{
  "movie":"Fast and Furious",
  "rating":"Good",
  "ratingTime":"2015-3-06 4:05:10"
},
{
  "movie":"Avengers Infinity Stones",
  "rating":"Very Good",
  "ratingTime":"2020-20-4 22:10:40"
},
{
  "movie":"Mad Max Fury Road",
  "rating":"Average",
  "ratingTime":"2015-3-06 15:23:25"
},
{
  "movie":"Toy story",
  "rating":"Good",
  "ratingTime":"2020-20-4 10:11:02"
}

Я хочу ее в следующем формате:

[
   {
       "2015-3-06":[{
            "movie":"Fast and Furious",
            "rating":"Good",
            "ratingTime":"2015-3-06 4:05:10"
        },{
            "movie":"Mad Max Fury Road",
            "rating":"Average",
            "ratingTime":"2015-3-06 15:23:25"
        }]
   },
   {
        "2020-20-4":[{
            "movie":"Avengers Infinity Stones",
            "rating":"Very Good",
            "ratingTime":"2020-20-4 22:10:40"
        },{
            "movie":"Toy story",
            "rating":"Good",
            "ratingTime":"2020-20-4 10:11:02"
        }]
   }
]

Кто-нибудь может мне помочь, так как я не получаю никаких идей, как получить результат в желаемом формате. Очень признателен за помощь

Ответы [ 4 ]

1 голос
/ 11 июля 2020

В вашей ситуации, насколько я понял, вы хотите использовать ключи схемы c Dynami. Но я думаю, что это плохая идея, лучше вы можете использовать первый вариант и отсортировать их по дате, или если вы действительно хотите его использовать, вы можете сделать это с помощью {string: false}. Использование strict делает всю вашу схему свободной формы, если вы не хотите, чтобы вся схема была свободной формой, но определенная ее часть, вы также можете изменить свою схему, чтобы использовать смешанный

   var movieSchema=newSchema({
       movie:{
          type:String
       },
       rating:{
          type:String
       },
       ratingTime:{
          type:Date,
          default:Date.now()
       }
  })

// var movieSchemaByDate = new Schema({..}, { strict: false }); /*if you are using older versions */
    var movieSchemaByDate = new Schema({..}) 
    var Movie = mongoose.model('Movie', movieSchemaByDate);
    var movie = new Movie({ [date]: movieSchema });
    movie.save();

Артикул:

mon goose strict

Classify mon goose массивы схемы по дате

0 голосов
/ 11 июля 2020

Как упоминал Эри c Аска в одном из ответов, именование полей Dynami c невозможно. Вы можете сгруппировать документы по дате следующим образом. Стоит заметить, что формат даты в данных кажется недействительным, поэтому я использую $substr.

const result = await Model.aggregate([
    {
        $group: {
            _id: { $substr: ["$ratingTime", 0, 9] },
            movies: {
                $push: "$$ROOT",
            },
        },
    },
]);

Результат будет выглядеть так.

[
  {
    "_id": "2020-20-4",
    "movies": [
      {
        "_id": "5f0a27a5df68ee25952ae10a",
        "movie": "Avengers Infinity Stones",
        "rating": "Very Good",
        "ratingTime": "2020-20-4 22:10:40",
        "__v": 0
      },
      {
        "_id": "5f0a27a5df68ee25952ae10c",
        "movie": "Toy story",
        "rating": "Good",
        "ratingTime": "2020-20-4 10:11:02",
        "__v": 0
      }
    ]
  },
  {
    "_id": "2015-3-06",
    "movies": [
      {
        "_id": "5f0a27a5df68ee25952ae109",
        "movie": "Fast and Furious",
        "rating": "Good",
        "ratingTime": "2015-3-06 4:05:10",
        "__v": 0
      },
      {
        "_id": "5f0a27a5df68ee25952ae10b",
        "movie": "Mad Max Fury Road",
        "rating": "Average",
        "ratingTime": "2015-3-06 15:23:25",
        "__v": 0
      }
    ]
  }
]

Его можно легко преобразовать в нужный вам формат.

const output = result.map(({_id, movies}) => ({[_id]: movies}))
0 голосов
/ 11 июля 2020
    const aggregate = await Test.aggregate([
      {
        $group: {
          _id: {
            $dateToString: {
              format: '%Y-%m-%d',
              date: '$ratingTime'
            }
          },
          root: {
            $addToSet: '$$ROOT'
          }
        }
      },
      {
        $unwind: {
          path: '$root',
          preserveNullAndEmptyArrays: false
        }
      },
      {
        $group: {
          _id: '$_id',
          movies: {
            $addToSet: '$root'
          }
        }
      }
    ]);
    aggregate.forEach((dateObj) => {
      dateObj[dateObj._id] = dateObj.movies;
      delete dateObj._id;
      delete dateObj.movies;
    });
    console.log(JSON.stringify(aggregate, undefined, 3));

и поскольку имя поля Dynami c невозможно в агрегировании (по крайней мере, я так думаю), вам нужно сделать все остальное после получения результатов.

, и результат будет:

    [
      {
        '2015-07-03': [
          {
            _id: '5f0a11833456a62a2a91e36a',
            movie: 'Mad Max Fury Road',
            rating: 'Average',
            ratingTime: '2015-07-03T12:23:25.000Z',
            __v: 0
          },
          {
            _id: '5f0a11833456a62a2a91e368',
            movie: 'Fast and Furious',
            rating: 'Good',
            ratingTime: '2015-07-03T12:23:25.000Z',
            __v: 0
          }
        ]
      },
      {
        '2020-05-20': [
          {
            _id: '5f0a11833456a62a2a91e36b',
            movie: 'Toy story',
            rating: 'Good',
            ratingTime: '2020-05-20T07:11:02.000Z',
            __v: 0
          },
          {
            _id: '5f0a11833456a62a2a91e369',
            movie: 'Avengers Infinity Stones',
            rating: 'Very Good',
            ratingTime: '2020-05-20T19:10:40.000Z',
            __v: 0
          }
        ]
      }
    ];

и ссылки для просмотра группировка по датам в mongodb

https://www.mongodb.com/products/compass

0 голосов
/ 11 июля 2020

Мое решение вашей проблемы было бы такого типа:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var movieSchema=newSchema(
{
    movie:{
        type:String
    },
    rating:{
        type:String
    },
    ratingTime:{
        type:Date,
        default:Date.now()
    }
}
)

var yearSchema = new Schema({
    movieYear:[movieSchema]
});
var books=mongoose.model('books',bookSchema)
module.exports=books;

Подробнее о Mon goose Subdocuments и Mon goose Schemas .

...