如何查询所述文档中集合内的 firestore 数据?

问题描述 投票:0回答:1

我正在尝试运行查询来查看用户的文档是否包含文档内的产品 id,但问题是产品 id 存储在它自己的下拉集合中,而不是存储在第一个数据组中,所以我需要要做的是向下延伸,但问题是可能有不止一个这样的产品,它们在创建时都有自动生成的 id。我正在尝试查询此内容,以确保用户在 vue 中的 v-if 语句中显示内容之前已购买该产品。

enter image description here 正如您所看到的,付款收集中有多个文档,我所追求的产品首先在商品下,然后在价格下,然后我才能到达那里,通常我会直接导航到产品,但我不能,因为付款集合文档自动生成并具有自动生成 ID。

我尝试做的是下面的事情。

<script>
import { projectFirestore } from '../../Firebase/Config'
import PriceSelection1 from "./CowgirlVid/PriceSelection1.vue";
import SubscribedAccountSignup1 from "./CowgirlVid/SubscribedAccountSighnup1.vue";
import { firebaseAuth } from "../../Firebase/firebase";
import { ref } from 'vue'
import {
  getFirestore,
  collection,
  query,
  where,
  getDocs,
} from "firebase/firestore";
export default {
    components: {
    PriceSelection1,
    SubscribedAccountSignup1
  },
  data() {
    return {
      isLoading: false,
      Purchased2: null,
    };
  },

  mounted() {
    this.fetchSubscription();
  },

  methods: {
    async fetchSubscription() {
      this.isLoading = true;
      const db = getFirestore();
      const subsRef = collection(
        db,
        "Subscribed", firebaseAuth.currentUser.uid, "payments"
      );
      const subsQuery = query(
        subsRef, 
        where("product", "==", "prod_QIRNX4klvLTfKe" )
      );

      this.subscription = await getDocs(subsQuery)
        .then((sub) => 
            sub.docs.length > 0 ? sub.docs[0].data() : null);

      this.isLoading = false;
    },
  },

忽略订阅并不意味着订阅我们正在处理条纹一次性产品,我试图将其 id 关闭我知道订阅产品在顶层有 id,但不幸的是这些是一次性产品,没有。

我还尝试使用来自 firebase 文档的 collectionGroup 查询,如下所示

  methods: {
    async fetchSubscription() {
      this.isLoading = true;
      const db = getFirestore();
      const subsRef = collection(
        db,
        "Subscribed", firebaseAuth.currentUser.uid, "payments"
      );
      const subsQuery = query(collectionGroup(
        subsRef, "items", "price" ),
        where("product", "==", "prod_QIRNX4klvLTfKe" )
      );

      this.subscription = await getDocs(subsQuery)
        .then((sub) => 
            sub.docs.length > 0 ? sub.docs[0].data() : null);

      this.isLoading = false;
    },
  },

是的,我已经导入了collectionGroup,我只是没有在此代码片段中包含我的代码顶部,因为它没有改变。

有谁知道如何使用collectionGroup或其他方式获取产品id?我将非常感谢任何帮助。

javascript firebase google-cloud-firestore
1个回答
0
投票

据我在屏幕截图中看到的,

items
字段是一个包含复杂对象的类型数组字段。不幸的是,您无法仅根据
items
数组中存在的对象的单个 ID 字段从“付款”集合中获取文档。换句话说,您无法仅根据产品 ID 创建查询。为了能够过滤数据,您应该使用整个对象,而不仅仅是一些部分数据。该对象应包含所有字段的值。

如果您无法使用整个对象来创建过滤,那么您唯一的选择就是创建一个仅包含产品 ID 的数组。最后,您可以使用

array contains
运算符过滤集合中的文档。

© www.soinside.com 2019 - 2024. All rights reserved.