Как упорядочить / отсортировать входящие данные из Firebase - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над firebase и проектом node.js Express, который в основном представляет собой систему заказов.

Я хочу отсортировать входящий заказ по времени. Я пробовал использовать функцию Orderby (), предоставляемую firebase, но она по-прежнему нарушает порядок вывода json.

Кажется, что это должно сработать, и мне не пришлось потом сортировать его в моем интерфейсе

Это мой маршрут для получения базы данных

// route for database 
router.get("/orderslist", (req, res) => {    

  let orders = []
  let number_of_orders

    // Getting the snapshot of the order collection
    db.collection('orders').orderBy('time').get().then( productSnapshot => {
      number_of_orders = productSnapshot.size

      // iterating over the order snapshot
      productSnapshot.forEach(orderDoc => {

        // creating an order object and assigning the ID and the rest of the information from the database
        var order = {
          id: orderDoc.id,
          customer_name: orderDoc.data().customer_name,
          date: orderDoc.data().date,
          comments: orderDoc.data().comments,
          time: orderDoc.data().time,
          total: orderDoc.data().total,
          order_status: orderDoc.data().order_status,
          products: []
        }
        // using the id, to get the products from the subcollection
        db.collection('orders/' + order.id + '/products').get().then( productSnapshot => {

          // iterating over the product snapshot
          productSnapshot.forEach(productDoc => {
            // creating a product object
            var product = {
              name: productDoc.data().name,
              price: productDoc.data().price
            }

            // then we push the product object to the list of products in the order object
            order.products.push(product)

          });

          // we are finished iterating over the productsnapshot and now we can push it to the orders list
          orders.push(order)

          // checks if the list is filled with everything from the database
          if(orders.length == number_of_orders){
            return res.json(orders)
          }

        });

      });

  });

});

Это это данные в json

[
  {
    "id": "xWmlB9fHD4rw8Di75llp",
    "customer_name": "Emil",
    "date": "07/05-2020",
    "comments": "without sugar",
    "time": "a",
    "total": 40,
    "order_status": true,
    "products": [
      {
        "name": "Latte",
        "price": 40
      }
    ]
  },
  {
    "id": "GWJoxe0DVFDWfi2AW6jS",
    "customer_name": "test",
    "date": "222222",
    "comments": "",
    "time": "f",
    "total": 10,
    "order_status": false,
    "products": [
      {}
    ]
  },
  {
    "id": "ggYSVKA1i0U8khIpeud4",
    "customer_name": "Oliver",
    "date": "01/05-2020",
    "comments": "order to be packed neatly because im on a bike",
    "time": "d",
    "total": 38,
    "order_status": false,
    "products": [
      {
        "name": "Latte Macchiato",
        "price": 38
      }
    ]
  }
]

1 Ответ

1 голос
/ 27 мая 2020

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

С учетом сказанного, узнать временные метки Firestore может быть сложно, вот как вы можете использовать их.

Когда вы получаете метки времени из Firestore, они имеют следующий тип:

enter image description here

Чтобы преобразовать это в обычную метку времени вы можете использовать функцию .toDate ().

Например, для следующего документа:

enter image description here

Мы можно использовать что-то вроде:

db.collection('[COLLECTION]').doc('[DOCUMENT]').get().then(function(doc) {
  console.log(doc.data().[FIELD].toDate());
});

, и результат будет примерно таким:

2019-12-16T16:27:33.031Z

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

Например: (здесь я использую Node.js)

db.collection('[COLLECTION]').doc('[DOCUMENT]').get().then(function(doc) {
  var stringified = doc.data().[FIELD].toDate().toISOString();
  //console.log(stringified);
  var split1 = stringified.split('T');
  var date = split1[0].replace(/\-/g, ' ');
  console.log(date);
  var time = split1[1].split('.');
  console.log(time[0]);
});

Вы получите следующий результат:

enter image description here

Теперь вы можете использовать подход orderby в самом запросе или после получения их в y наш интерфейс.

Пример orderby следующий:

db.collection('[COLLECTION]')
            .orderBy("timeStamp", Query.Direction.ASCENDING)

Однако, если вы планируете продолжать использовать имеющийся у вас тип строки (не рекомендуется), вам придется преобразовать это строка к числовому c значению (возможно ASCII), чтобы иметь возможность правильно фильтровать это как объект времени.

...