Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想一次性将用户联系人同步到firebase firestore_Firebase_Google Cloud Firestore_Chat_Querying - Fatal编程技术网

我想一次性将用户联系人同步到firebase firestore

我想一次性将用户联系人同步到firebase firestore,firebase,google-cloud-firestore,chat,querying,Firebase,Google Cloud Firestore,Chat,Querying,我正在构建有点像whatsapp的聊天应用程序。我想在创建新组时显示用户设备联系人列表中的已注册应用程序用户列表。现在为了做到这一点,我必须将每个联系人号码与firebase firestore用户进行比较。任何普通用户都可以在设备中拥有500多个联系人。而且firestore对查询数据库有限制,因此我一次不能比较多个数字,整个过程几乎需要6-7分钟,而且每次读取操作都会产生财务成本 我如何克服这种情况,或者用什么更好的方法来处理这种特殊情况?您可以将用户的联系人存储在设备上,并仅将其作为备份发

我正在构建有点像whatsapp的聊天应用程序。我想在创建新组时显示用户设备联系人列表中的已注册应用程序用户列表。现在为了做到这一点,我必须将每个联系人号码与firebase firestore用户进行比较。任何普通用户都可以在设备中拥有500多个联系人。而且firestore对查询数据库有限制,因此我一次不能比较多个数字,整个过程几乎需要6-7分钟,而且每次读取操作都会产生财务成本


我如何克服这种情况,或者用什么更好的方法来处理这种特殊情况?

您可以将用户的联系人存储在设备上,并仅将其作为备份发送到firestore。然后,您可以在应用程序启动时将本地数据库与firestore同步。 您需要的操作在firebase中不可能是健壮的。即使如此,如果您想在firebase数据中进行搜索,您也需要使用第三方搜索解决方案,如弹性搜索,对firebase数据执行复杂的搜索

对于本地数据库,您可以使用文件室库:


要在Firebase中使用弹性搜索,请查看此实用工具手电筒:

您可以将用户的联系人存储在设备上,并仅将其作为备份发送到firestore。然后,您可以在应用程序启动时将本地数据库与firestore同步。 您需要的操作在firebase中不可能是健壮的。即使如此,如果您想在firebase数据中进行搜索,您也需要使用第三方搜索解决方案,如弹性搜索,对firebase数据执行复杂的搜索

对于本地数据库,您可以使用文件室库:


要在Firebase中使用弹性搜索,请查看此实用工具手电筒:

OP要求一个结构和一些代码(Swift、Firebase数据库)作为解决方案。我将提出两种选择

如果您想使用Firebase查询查看电话号码是否存在,可能的结构是

users
  uid_0
    contact_name: "Larry"
    contact_phone: "111-222-3333"
  uid_1
    contact_name: "Joe"
    contact_phone: "444-555-6666"
然后输入swift代码以查询现有号码

let phoneNumbers = ["111-222-3333","444-555-6666"] //an array of numbers to look for
let myQueryRef = self.ref.child("users")
for contactPhone in phoneNumbers {
    let queryRef = myQueryRef.queryOrdered(byChild: "contact_phone").queryEqual(toValue: contactPhone)
    queryRef.observeSingleEvent(of: .childAdded, with: { snapshot in
        if snapshot.exists() {
            print("found \(contactPhone)") //or add to array etc
        }
    })
}
通常不建议在这样一个紧密的循环中进行查询,但对于迭代次数较少的我来说,这通常很好。但是,查询的开销要比.observators大得多

在我看来,一个更好、更快的选择是保留一个只有电话号码的节点。然后迭代你正在寻找和使用的节点,观察该节点是否存在

phone_numbers
   111-222-3333: true
   444-555-6666: true
然后输入代码,查看数组中的那些是否存在

let phoneNumbers = ["111-222-3333","444-555-6666"] //an array of numbers to look for
let phoneNumberRef = self.ref.child("phone_numbers")
for contactPhone in phoneNumbers {
    let ref = phoneNumberRef.child(contactPhone)
    ref.observeSingleEvent(of: .value, with: { snapshot in
        if snapshot.exists() {
            print("found \(contactPhone)")
        }
    })
}

在测试中,第二个解决方案必须比第一个解决方案快。

OP请求一个结构和一些代码(Swift、Firebase数据库)作为解决方案。我将提出两种选择

如果您想使用Firebase查询查看电话号码是否存在,可能的结构是

users
  uid_0
    contact_name: "Larry"
    contact_phone: "111-222-3333"
  uid_1
    contact_name: "Joe"
    contact_phone: "444-555-6666"
然后输入swift代码以查询现有号码

let phoneNumbers = ["111-222-3333","444-555-6666"] //an array of numbers to look for
let myQueryRef = self.ref.child("users")
for contactPhone in phoneNumbers {
    let queryRef = myQueryRef.queryOrdered(byChild: "contact_phone").queryEqual(toValue: contactPhone)
    queryRef.observeSingleEvent(of: .childAdded, with: { snapshot in
        if snapshot.exists() {
            print("found \(contactPhone)") //or add to array etc
        }
    })
}
通常不建议在这样一个紧密的循环中进行查询,但对于迭代次数较少的我来说,这通常很好。但是,查询的开销要比.observators大得多

在我看来,一个更好、更快的选择是保留一个只有电话号码的节点。然后迭代你正在寻找和使用的节点,观察该节点是否存在

phone_numbers
   111-222-3333: true
   444-555-6666: true
然后输入代码,查看数组中的那些是否存在

let phoneNumbers = ["111-222-3333","444-555-6666"] //an array of numbers to look for
let phoneNumberRef = self.ref.child("phone_numbers")
for contactPhone in phoneNumbers {
    let ref = phoneNumberRef.child(contactPhone)
    ref.observeSingleEvent(of: .value, with: { snapshot in
        if snapshot.exists() {
            print("found \(contactPhone)")
        }
    })
}

在测试中,第二个解决方案必须比第一个解决方案快。

我不需要任何复杂的搜索,甚至不需要文本搜索。这是一个精确的文本比较,例如,
device.phoneNumber==firestore.phoneNumber
,但问题是我有500多个联系人,这需要时间,我在应用程序启动时同步联系人,但如果用户在一分钟左右后关闭应用程序会怎么样。同步现在需要6分钟以上。您可以使用子事件侦听器使同步高效,并将数据存储在本地数据库中。下次应用程序启动时,获取本地存储的最后一条记录,获取其id并将查询设置为从该点读取。这将起作用,因为firebase生成的ID已排序,因此您不会错过任何ID。这可以帮助我进行同步,但我希望优化此操作,并希望在几秒钟内运行此操作。将您的数据索引到本地数据库中以查找电话号码,您的搜索速度将显著加快。此外,如果您为firebase数据库编制索引并直接进行查询,也将改进您在firebase中的搜索。firestore会自动为您的文档密钥编制索引,这样就不会出现问题。我会将设备联系人存储在我的应用程序中,这样也不会出现问题。我不需要任何复杂的搜索,甚至不需要文本搜索。这是一个精确的文本比较,例如,
device.phoneNumber==firestore.phoneNumber
,但问题是我有500多个联系人,这需要时间,我在应用程序启动时同步联系人,但如果用户在一分钟左右后关闭应用程序会怎么样。同步现在需要6分钟以上。您可以使用子事件侦听器使同步高效,并将数据存储在本地数据库中。下次应用程序启动时,获取本地存储的最后一条记录,获取其id并将查询设置为从该点读取。这将起作用,因为firebase生成的ID已排序,因此您不会错过任何ID。这可以帮助我进行同步,但我希望优化此操作,并希望在几秒钟内运行此操作。将您的数据索引到本地数据库中以查找电话号码,您的搜索速度将显著加快。此外,如果您为firebase数据库编制索引并直接进行查询,也将改进您在firebase中的搜索。firestore会自动为您的文档密钥编制索引,这样就不会出现问题,而我会将设备联系人存储在我的应用程序中,这样也不会出现问题。我刚刚用快速firebase应用程序(不是firestore)对此进行了测试我可以在大约2秒内查询500个电话号码(Swift 4),并将匹配的号码存储在一个数组中。不确定是什么原因导致您延迟,但这不是Firestore,因为性能离Firebase不远。通过进一步测试,假设您为每个联系人(500个)找到匹配项,将时间增加到8秒,包括printi