firebase Firestore查询-数组包含所有

mzmfm0qo  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(110)

我的用例涉及到使用'array-contains-all'过滤Firestore文档,我为此问题的目的而命名。然而,'array-contains-any'已经存在,但它不会检查数组中是否存在所有元素,我很难找到一个内置的解决方案或找到一个更好的方法来实现相同的结果,而不是查询所有的文档(昂贵的),然后在最终数组传递给客户端之前在云函数中过滤结果。
举个给予例子,我们想知道哪些住宿网站拥有我们感兴趣并希望查询的所有以下设施:

[
    'lockable_bedroom_door',
    'private_bathroom',
    'internet',
    'desk',
    'safe_place_to_store_valuables'
]

字符串
在所有13个可用设施中:

[
    'kettle',
    'microwave',
    'cooker',
    'washing_machine',
    'fully_functional_kitchen',
    'lockable_bedroom_door',
    'private_bathroom',
    'shared_bathroom',
    'internet',
    'desk',
    'common_room_lounge',
    'safe_place_to_store_valuables',
    'free_on-site_parking'
]


如何做到这一点,同时考虑到Firestore的限制和用户可能选择的设施数量?

qvtsj1bj

qvtsj1bj1#

只要你像现在这样使用列表类型字段,就不会有一种你会发现有效的查询方法。如果你将数据复制到一个新的Map类型字段中,这将是可能的。

facilities: {
    'kettle': true
    'microwave': true
    'cooker': true
}

字符串
有了这个包含已知布尔值的Map,你可以像这样查询:

firestore
    .collection("your-collection")
    .where("facilities.kettle", "==", true)
    .where("facilities.microwave", "==", true)
    .where("facilities.cooker", "==", true)

ccrfmcuu

ccrfmcuu2#

也许这能帮上忙,我为此实施了一个变通方案

// generate all every combinasons possibles
fun generateTags(list: List<String>): List<String> {
    val combinations = mutableListOf<String>()

    val size = list.size
    val maxMask = (1 shl size) - 1

    for (mask in 1..maxMask) {
        val current = mutableListOf<String>()
        for (i in 0 until size) {
            if ((mask and (1 shl i)) != 0) {
                current.add(list[i])
            }
        }
        combinations.add(current.joinToString("_"))
    }

    return combinations
}

字符串
保存结果到一个数组字段中,然后在查询中使用WhereArrayContains(Field,list.joinToString(“_”))。
对不起,我的英语,我只会说法语。

相关问题