Angular firestore array_contains 对象

Posted

技术标签:

【中文标题】Angular firestore array_contains 对象【英文标题】:Angular firestore array_contains on objects 【发布时间】:2019-02-02 19:28:48 【问题描述】:

我有以下文件:


    "ID" : "01",
    "Name" : "A1",
    "players" : [ 
        "active" : false,
        "name" : "dissident"
      , 
        "active" : false,
        "name" : "ink"
      
    ]

用 JSON 写下来,这样更容易理解。 现在我想要对 firestore 做的是查询 player[*].name。 我已经看到了使用“array_contains”的新选项。

但我看到所有示例都使用字符串数组而不是对象数组。 是否可以查询players[*].name?

这是我尝试过的:

this.afs.collection('Locations', ref => ref.where('players.name', 'array-contains', _name))

基于我建立的@camden_kid 反应:

this.locationsCollection = this.afs.collection('Locations', ref => ref.where('players', 'array-contains', active : false, name : _name) );
if(this.locationsCollection === undefined)
    this.locationsCollection = this.afs.collection('Locations', ref => ref.where('players', 'array-contains', active : true, name : _name) );

但这取决于活动值,这不适用于每种情况。

【问题讨论】:

您是否尝试过针对整个对象进行测试?例如。 this.afs.collection('Locations', ref => ref.where('players', 'array-contains', active : false, name : _name)) 您可以将其添加为有效的答案:) 【参考方案1】:

您不能以您正在寻找一个参数的方式在对象上使用它。 Firestore 不支持这个(很烦人)。我研究了几种方法。 John Delaney 的 Firestore 建模课程旨在解决这些问题以及更多问题。

更好的方法是有两个数组,其中一个只包含 id/guid 作为字符串,并在其上使用数组包含。

如果您仍然需要对象,只需创建/拥有带有对象的第二个数组,当您将对象添加到一个数组时,您将字符串添加到另一个数组。

【讨论】:

【参考方案2】:

您可以尝试针对整个对象进行测试,例如

this.afs.collection('Locations', ref => ref.where('players', 'array-contains', active : false, name : _name))

【讨论】:

就像我在问题中解释的那样,这是一个很好的解决方法,但还需要检查 active 是否为真。如果有更多对象项,这将不起作用。 @Swoox 这是真的,只能进行一次“包含数组”的测试,否则会引发错误。让我想想。 @Swoox 将您的数据分成两个名称数组有什么帮助吗?例如。 players_active, players_inactive. 这将使它变得相当复杂,并且每个数字都必须相互匹配。 最后我遵循了你的解决方案,我为玩家添加了位置并将它们移动到不同的集合中。

以上是关于Angular firestore array_contains 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Firestore 中使用 Angular 删除集合中的文档

Angular Firestore 映射文档到对象

使用@angular/fire@6.0.3 无法访问firebase.firestore.FieldValue.serverTimestamp()

markdown Angular Firestore sql就好

解析器无法使用 Angular Firestore 解析

检查字段是不是已使用 Angular 6 和 Firestore 进行了修改