Vue Js和Firebase关系查询问题

时间:2019-12-18 10:35:42

标签: firebase vue.js google-cloud-platform google-cloud-firestore

我正在使用Vue Js和Firebase创建一个项目。从两个表中查询关系数据时遇到一些问题。我已经对SQL数据库关系系统有所了解。但是,由于Firebase是NoSQL数据库,因此为什么不知道如何解决它。

表1 客户
  -> id
  ->名称

表2 销售
  -> id
  ->客户名称
  ->日期

这是我对.vue文件的查询

  let ref = db.collection('sales').where("created_month", "==", moment().format('MM-YYYY'))
                                  .orderBy('timestamp', 'desc')

  ref.onSnapshot(snapshot => {
    snapshot.docChanges().forEach(change => {
      if(change.type == 'added'){
        let doc = change.doc
        this.sales.push({
          id:doc.id,
          item_name:doc.data().item_name,
          price:doc.data().price,
          timestamp:moment(doc.data().timestamp).format('ll')
        })
      }
    })
  })

我的问题是如何使用客户表中的客户ID来检索客户名并显示在销售表上。

3 个答案:

答案 0 :(得分:2)

由于您的数据模型如下

Document in Collection "Customers"
 -> id
 -> name

Document in Collection "Sales"
 -> id
 -> customer_name
 -> date

我假设客户ID实际上存储在customer_name字段中的销售文档中。

因此,您需要在侦听器中使用get()方法来获取客户文档。以下应该可以解决问题。

  const ref = db.collection('sales').where("created_month", "==", moment().format('MM-YYYY')).orderBy('timestamp', 'desc')

  ref.onSnapshot(snapshot => {
    snapshot.docChanges().forEach(change => {
      if(change.type == 'added'){
        let doc = change.doc;

        const customerId = doc.data().customer_name;
        const customerDocRef = db.collection('customers').doc(customerId);

        customerDocRef.get()
        .then(doc => {
           const customer_name = doc.data().name;  // Here we get the value of customer_name

          this.sales.push({
            id:doc.id,
            item_name:doc.data().item_name,
            price:doc.data().price,
            timestamp:moment(doc.data().timestamp).format('ll'),
            customer_name: customer_name  //Here we add the customer_name in each object that is pushed into the sales array
          })
      }
    })
  })

已经说过,NoSQL数据库中的一种经典方法是以一种易于执行且快速执行查询的方式对数据进行非规范化。

在您的情况下,这意味着保存新的Sale时,您将在customer_idcustomer_name中直接写在Sales文档中。

我建议您看一下此Firebase视频,其中对这种方法进行了很好的解释:https://www.youtube.com/watch?v=v_hR4K4auoQ。您还可以阅读有关NoSQL数据建模方法的“著名”文章:https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/

答案 1 :(得分:1)

也许可以只使用filter()或find()吗?

let userSales = []
this.sales.forEach( sale => {
const costumer = costumers.find( costumer => costumer.id === sale.id)
userSales.push(costumer)
}

或者只是将销售收藏放入用户收藏中。

答案 2 :(得分:0)

尝试以下操作:

  let ref = db.collection('customers').where("id", "==", id);
  ref.get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, " => ", doc.data());
            let customerName = doc.data().name;
            let salesRef     = db.collection('sales').doc('some-id');
            salesRef.set({
                   customerName : customerName,
                   date: "date",
                   id: "id"
                  }).then(function() {
                       console.log("Document successfully written!");
                  }).catch(function(error) {
                       console.error("Error writing document: ", error);
                  });
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });

添加对集合customers的引用,然后使用查询where可以检索客户名称。然后,您可以将该名称添加到sales文档中