【问题标题】:find docs where field a=value x or field b = value x in firebase firestore在 firebase firestore 中查找字段 a=value x 或字段 b = value x 的文档
【发布时间】:2020-10-13 15:55:26
【问题描述】:

我正在使用 firebase firestore 开发一个聊天应用程序。聊天文档具有以下结构

   {
   chatid: "FZSIPMuxxxGDuOZxxx",
   uid: "D9CPxxxxfMfMRLxxxxxxENiso2", --> /*sender_id*/
   receipient: "gsKQxxxxcJfiyxxxxxC7frDD9y1",   --> /*recipient_id*/
   count: 0, 
   messages: Array(n), --->/*messages*/
   …}

如果我有一个变量 user_id。我希望我的查询找到 uid==user_id 或接收者==user_id 的文档

我现在的代码是

db.collection("chats").where("uid", "==", user_id).where("receipient","==", user_id); 

But I dont get the any results.
Most examples I have seen check the same field against two values. like uid==1 or uid==2

But I am looking to compare the user_id against uid or recipient. Thank You!

【问题讨论】:

    标签: firebase google-cloud-firestore nosql angularfire2


    【解决方案1】:

    结合这些“where”方法将产生逻辑“AND”而不是“OR”,如您所见。

    根据 firebase,如果您在数组字段中挖掘,则只有一个逻辑“或”,而不是您想要的多个字段:

    https://firebase.google.com/docs/firestore/query-data/queries#in_and_array-contains-any

    我遇到了同样的问题,最终像制作了一个 firebase-function(考虑到某些规则可能在前端不起作用)做类似的事情:

    
    let user_uid = "xxx"
    let myChats = []
    db.collection("chats")
      .onSnapshot(snapshot => {
        snapshot.forEach(doc => {
          if (doc.data().recipient_id == user_uid || doc.data().uid == user_uid) {
            myChats.push(doc.data())
          }
        })
        console.log(myChats)
        // ...
      })
    

    但这里的问题是,它最终会加载比您需要的更多的文档,因此您应该考虑 firebase 中的配额使用情况..

    //编辑:函数有错误..

    //edit2:

    这里是另一个选项,您不获取整个集合,而仅获取 user_id 和接收者 ID 的文档。因此,如果两个字段中的 uid 相同,则只有那些文档可以被双重获取:

    let fetchChats = async user_id => {
      let dbRef = db.collection("chats")
      let response1 = await dbRef.where('uid', '==', user_id).get()
      let response2 = await dbRef.where('recipient_id', '==', user_id).get()
      let arr1 = response1.docChanges().map(element => element.doc.data())
      let arr2 = response2.docChanges().map(element => element.doc.data())
      let allChats = [...arr1, ...arr2]
      // make array unique by converting to an object
      let myChatsObj = {}
      allChats.forEach(item => { myChatsObj[item.chatid] = item })
      let myChats = Object.values(myChatsObj)
      return myChats
    }
    

    【讨论】:

    • 试过这段代码,但没有用。看起来你在那里打错了,你可以检查一下吗?
    • 第一个还是第二个代码?错误说明了什么?
    • 别忘了定义:let db = admin.firestore(),请注意,该函数返回一个 Promise,所以你必须异步/等待它:(async () => {let chats = await fetchChats('xxx');console.log(chats);})()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-04-11
    • 2021-11-22
    相关资源
    最近更新 更多