角型Firestore array_contains对象

时间:2018-08-28 08:19:03

标签: angular firebase google-cloud-firestore

我有以下文件:

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

将其用JSON写下,以便于理解。 现在,我要使用firestore进行的是对player [*]。name的查询。 我已经看到了使用“ array_contains”的新选项。

但是我已经看到所有示例都使用字符串数组而不是对象数组。 是否可以查询玩家[*]。名称?

这是我尝试过的:

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}) );
}

但这取决于有效值,这不适用于每种情况。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

更好的方法是有两个数组,每个数组仅包含id / guid作为字符串,并在其上使用array-contains。

如果仍然需要对象,则只需创建/拥有带有对象的第二个数组,然后将对象添加到其中一个,即可将字符串添加到另一个对象中。