Пн goose Схема - Как добавить атрибут заказа для сортировки - PullRequest
0 голосов
/ 24 марта 2020

В настоящее время я создаю веб-приложение, в котором вы можете создавать сет-листы (массивы) с массивом лири c objectId внутри, которые затем можно отсортировать / упорядочить по своему желанию. Так что если вы хотите, чтобы третий элемент списка стал первым, просто перетащите его на первую строку.

Теперь у меня проблема с моей схемой mon goose. Я ищу способ реализовать атрибут порядка или что-то, что позволило бы мне добавить значение порядка, например 0 или 1, в зависимости от положения текста. Кто-нибудь из вас знает, как лучше всего реализовать такой порядок?

Вот копия моей схемы. В настоящее время текст песни представляет собой массив lyri c objectId. Но там мне понадобится и «Порядок», чтобы я мог отсортировать массив по значению заказа.

const mongoose = require("mongoose");

const SetlistSchema = new mongoose.Schema({
    setlistName: { type: String, required: true },
    lastEdited: { type: Date },
    createdAt: { type: Date, default: Date.now },
    lyrics: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Lyric'
    }],
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    }
});

module.exports = mongoose.model("Setlist", SetlistSchema);

Вот схема Lyrics.

const mongoose = require("mongoose");

const LyricSchema = new mongoose.Schema({
    lyricName: { type: String, required: true },
    lyricContent: { type: String, required: true },
    lastEdited: { type: Date },
    createdAt: { type: Date, default: Date.now },
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    }
});

module.exports = mongoose.model("Lyric", LyricSchema);

Если добавление номера заказа не является наилучшей практикой, что вы можете порекомендовать в качестве способа отслеживания порядка, в котором пользователь хотел бы видеть текст песни?

1 Ответ

0 голосов
/ 24 марта 2020

Вы можете использовать структуру агрегации для сортировки текстов по полю заказа. Сначала вам нужно добавить поле сортировки с типом Number.

Setlist.aggregate([
  {
    $unwind: "$lyrics"
  },
  {
    $lookup: {
      from: "lyrics",  // MUST be the PHYSICAL collection name
      localField: "lyrics",
      foreignField: "_id",
      as: "lyrics"
    }
  },
  {
    $sort: {
      "lyrics.order": 1
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "lyrics": {
        "$push": "$lyrics"
      },
      "allFields": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$allFields",
          {
            "lyrics": "$lyrics"
          }
        ]
      }
    }
  }
])

Playground

Образцы документов:

db={
  "lists": [
    {
      "_id": ObjectId("5a934e000102030405000000"),
      "setlistName": "list1",
      "lastEdited": ISODate("2020-03-18T23:11:56.443+03:00"),
      "createdAt": ISODate("2020-03-15T23:11:56.443+03:00"),
      "lyrics": [
        ObjectId("6a934e000102030405000000"),
        ObjectId("6a934e000102030405000001"),
        ObjectId("6a934e000102030405000002")
      ]
    },
    {
      "_id": ObjectId("5a934e000102030405000001"),
      "setlistName": "list2",
      "lastEdited": ISODate("2020-03-11T23:11:56.443+03:00"),
      "createdAt": ISODate("2020-03-11T23:11:56.443+03:00"),
      "lyrics": [
        ObjectId("6a934e000102030405000003"),
        ObjectId("6a934e000102030405000004")
      ]
    }
  ],
  "lyrics": [
    {
      "_id": ObjectId("6a934e000102030405000000"),
      "name": "Lyric 1",
      "order": 3
    },
    {
      "_id": ObjectId("6a934e000102030405000001"),
      "name": "Lyric 2",
      "order": 1
    },
    {
      "_id": ObjectId("6a934e000102030405000002"),
      "name": "Lyric 3",
      "order": 2
    },
    {
      "_id": ObjectId("6a934e000102030405000003"),
      "name": "Lyric 4",
      "order": 2
    },
    {
      "_id": ObjectId("6a934e000102030405000004"),
      "name": "Lyric 5",
      "order": 1
    }
  ]
}

Вывод: (как вы видите тексты песен отсортированы по значению поля заказа)

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "createdAt": ISODate("2020-03-15T20:11:56.443Z"),
    "lastEdited": ISODate("2020-03-18T20:11:56.443Z"),
    "lyrics": [
      [
        {
          "_id": ObjectId("6a934e000102030405000001"),
          "name": "Lyric 2",
          "order": 1
        }
      ],
      [
        {
          "_id": ObjectId("6a934e000102030405000002"),
          "name": "Lyric 3",
          "order": 2
        }
      ],
      [
        {
          "_id": ObjectId("6a934e000102030405000000"),
          "name": "Lyric 1",
          "order": 3
        }
      ]
    ],
    "setlistName": "list1"
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "createdAt": ISODate("2020-03-11T20:11:56.443Z"),
    "lastEdited": ISODate("2020-03-11T20:11:56.443Z"),
    "lyrics": [
      [
        {
          "_id": ObjectId("6a934e000102030405000004"),
          "name": "Lyric 5",
          "order": 1
        }
      ],
      [
        {
          "_id": ObjectId("6a934e000102030405000003"),
          "name": "Lyric 4",
          "order": 2
        }
      ]
    ],
    "setlistName": "list2"
  }
]
...