【问题标题】:Javascript - sort documents in firestore, get data from themJavascript - 在firestore中对文档进行排序,从中获取数据
【发布时间】:2021-03-29 15:42:06
【问题描述】:

我对 google 的存储有一点问题。我的 Firestore 中的数据按以下方式排序:

-chatrooms(collection)
    -chatroom1(document)
      -chatroom1(collection)
         -message1(document)
         -message2(document)
         -message3(document)
    -chatroom2
    -...

每条消息都只是一个文档,格式如下:

counter: integer
partner1: string
partner2: string
sender: string
value: string

我的目标是从每个聊天室获取最后一条聊天消息并将它们存储在一个数组中。我为此尝试以下命令:

lastmessage = await firebase.firestore().collection("chatrooms").doc(`${chatkeys[i]}`).collection(`${chatkeys[i]}`).orderBy("counter").limit(1).get().then(
                querySnapshot => {
                    querySnapshot.docs.forEach(doc => {
                        console.log(doc)
                    })
                }
            )

你看,我尝试使用 orderBy 并从所有消息中获取最新的消息,我也将它限制为 1,所以我只得到一个结果,准确地说是最新的。之后,我使用 querySnapshot 并想退出文档,我得到了“值”键(查看上面我的消息文件的格式,它们都有一个“值”键,即聊天消息)但现在我开始去奋斗。

因此,我得到了以下非常长的代码,我不知道发生了什么,我将向您展示其中的一部分:

"cP": e {
    "Qe": Map {
      "counter" => e {
        "Ne": 2,
        "Zt": 1,
      },
    },
    "ce": false,
    "converter": [Function anonymous],
    "hasCommittedMutations": false,
    "key": t {
      "path": e {
        "len": 4,
        "offset": 5,
        "segments": Array [
          "projects",
  ...(truncated to the first 10000 characters)

谁能解释发生了什么,甚至更好,告诉我如何才能实现我的目标? 我只想从最新文档中获取“值”字符串。我不明白如何使用 orderBy 从过滤后的文档中获取数据。

【问题讨论】:

  • 您如何访问value 密钥?您应该使用doc.data().value,但看起来您只是在记录doc。除此之外,您的查询似乎很好。
  • @Aside 成功了!如果你想在这里写下这个作为你的答案,那么我可以给你绿色的复选标记。理解这个查询有很大困难,谢谢你的简单回答。
  • @Aside,您的评论对 OP 非常有帮助。请将其发布为答案。
  • @Aside 我现在还有一个问题,也许你也可以帮我解决这个问题。 console.log() 给了我正在寻找的结果。另一方面,“return”给了我一个不确定的回报。我也尝试过研究,但适用于其他人的解决方案不适合我,你可能知道如何解决这个问题?

标签: javascript reactjs react-native google-cloud-firestore


【解决方案1】:

正如@Aside 在 cmets 中提到的,更改您记录输出的方式并使用doc.data().value

querySnapshot.docs.forEach(doc => {
  console.log(doc.data().value)
})

这里还有一个reference

一个 QuerySnapshot 包含零个或多个表示查询结果的 DocumentSnapshot 对象。文档可以通过 docs 属性作为数组访问,也可以使用 forEach 方法进行枚举。文档的数量可以通过 empty 和 size 属性来确定。

【讨论】:

    【解决方案2】:

    我认为下面的解决方案比使用forEach 的批准解决方案更合适(意味着循环一个值数组):

    lastmessage = await firebase
      .firestore()
      .collection("chatrooms")
      .doc(`${chatkeys[i]}`)
      .collection(`${chatkeys[i]}`)
      .orderBy("counter")
      .limit(1)
      .get()
      .then(QuerySnapshot => 
        QuerySnapshot.docs[0].data()
      );
    

    一个 QuerySnapshot 包含零个或多个 DocumentSnapshot 对象 表示查询的结果。这些文档可以访问为 通过 docs 属性的数组

    文档:数组

    https://firebase.google.com/docs/reference/node/firebase.firestore.QuerySnapshot?authuser=0

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多