簡體   English   中英

Firebase 實時數據庫 - orderByChild().equalTo() 不返回預期節點

[英]Firebase Realtime Database - orderByChild().equalTo() does not return expected node

我有 Firebase 實時數據庫數據結構如下,我想在“聯系人”和“筆記”節點中將“-preliminaryId”替換為“-ultimateId123”。 為此,我將刪除舊節點並用新節點替換它們。

"prel":{
  "-preliminaryId": {
    "email" : "hello@bye.com"
  }
},
"contacts": {
  "-ABC": {
     "-BCD": {
       "email": "bye@nowhere.com",
       "uid" : "-123456WWWXYz"
     },
     "-preliminaryId": {
       "email": "hello@bye.com",
       "uid": "-preliminaryId"
     }
  }
},
"notes": {
  "-noteIdone": {
    "access": {
      "members": {
        "-preliminaryId": 1
      }
    }
  },
  "-noteIdtwo": {
    "access": {
      "members": {
        "-realId1234": 1
      }
    }
  }
}

email“hello@bye.com”的新 id 應該是“-ultimateId123”。 (我不能將 email 作為鍵存儲在 Firebase 實時數據庫中。)

我首先獲取要替換的初步 id。

  const prelSnap = await dbRoot.child('prel').orderByChild('email').equalTo('hello@bye.com').once('value')
  const prelData= prelSnap.val()
  console.log('prelData', prelData)
  const oldId = Object.keys(prelData)[0]

prelData變量將是

{ -preliminaryId: { email: 'hello@bye.com' } } 

但是,我希望它只是

{ email: 'hello@bye.com' }

所以我可以通過prelSnap.key而不是Object.keys(prelData)[0]獲得oldId

然而,我真正的障礙是獲取contacts

  const contactSnaps = await dbRoot.child('contacts').orderByChild(`${oldId}/uid`).equalTo(oldId).once('value')
  console.log('contactSnaps', contactSnaps.numChildren())
  contactSnaps.forEach((contact)=>{
    console.log('contactData', contact.val())
    const userId = Object.keys(contactData)[0] 
    ...
    // Replace the contact node
    myPromises.push(dbRoot.child(`contacts/${userId}/${newId}`).set(contactObj)) // Create new contact data
    myPromises.push(dbRoot.child(`contacts/${userId}/${oldId}`).remove()) // Delete old contact
    ...
  })

這將使我獲得所有聯系人。 console.log('contactData', contact.val())注銷將是:

numChildren 1

contactData {
   "-BCD": {
     "email": "bye@nowhere.com",
     "uid" : "-123456WWWXYz"
   },
   -preliminaryId: {
     "email": "hello@bye.com",
     "uid": "-preliminaryId"
   }
}

硬編碼示例:

const contactSnaps = await dbRoot.child('contacts').orderByChild('-preliminaryId/uid').equalTo('-preliminaryId').once('value')
console.log('contactSnapsHC', contactSnaps.numChildren())
contactSnaps.forEach((contact)=>{
  const contactData = contact.val()
  console.log('contactDataHC', contactData)
})

Output 來自上面的硬編碼示例:

contactSnapsHC 1
contactDataHC { -BCD: { email: "bye@nowhere.com", uid : "-123456WWWXYz" }, -preliminaryId: { email: "hello@bye.com", uid: "-preliminaryId" } }

我的猜測是,這可能與我的第一個查詢問題有關?

當對筆記執行相同類型的查詢時,一切都很好。

nodeSnaps = await dbRoot.child('notes').orderByChild(`access/members/${oldId}`).equalTo(1).once('value')
console.log('notes', nodeSnaps.numChildren())
nodeSnaps.forEach((node)=>{
  console.log('notesData', node.val())
  ...
}

這里的 output 將是:

notes 1
notesData { "access": { "members": { "-preliminaryId": 1 } } }

我希望前兩個查詢在與notes查詢相同的節點級別返回結果。

如何查詢數據庫以返回如下所示的結果?

prelData { email: 'hello@bye.com' }
contactData { email: 'hello@bye.com', uid: '-preliminaryId' }

親切的問候/K

我認為您的困惑在於查詢在此處返回的內容:

dbRoot.child('contacts').orderByChild('-preliminaryId/uid').equalTo('-preliminaryId')

Firebase 查詢在平面列表上運行。 由於您查詢contacts ,因此返回的節點將是contacts的子節點。 具體來說,它返回具有屬性-preliminaryId/uidcontact的任何子節點,其值為-preliminaryId 在您的示例中, contacts/-ABC的節點是正確的,這就是查詢為我返回的內容。


例如,當我在ABC同一級別添加另一個兄弟節點時:

"contacts": {
  "-ABC": {
     "-BCD": {
       "email": "bye@nowhere.com",
       "uid" : "-123456WWWXYz"
     },
     "-preliminaryId": {
       "email": "hello@bye.com",
       "uid": "-preliminaryId"
     }
  },
  "DEF": {
     "-HKI": {
       "uid": "another id"
     }
  }
},

在這種情況下,您的查詢仍然只返回-ABC節點,因為這是唯一存在-preliminaryId/uid且值正確的節點。

有關此操作的示例,請參閱: https://jsbin.com/wivukeq/edit?js,console

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM