Firestore通过数组字段值查询

47

我正在尝试运行一个简单查询,查询包含对象数组内值的文档。

例如,看看我的数据库结构:

firestore db

我想运行类似于这样的查询:
db.collection('identites').where("partyMembers", "array-contains", {name: "John Travolta"})

如何以正确的方式实现这一点,使用Firestore是否可行?

谢谢。


我想用传递ID的方式做同样的事情,你能帮忙吗? - user16583109
4个回答

49

正如Frank在他的回答中解释的那样,使用array-contains无法查询存储在数组中的对象的特定属性。

然而,有一个可能的解决方法:实际上可以按如下方式查询整个对象:

在您的情况下:

db.collection('identites')
  .where(
    "partyMembers",
    "array-contains",
    {id: "7LNK....", name: "John Travolta"}
  )
也许这种方法能够满足您的需求(或者可能不行……)。

1
我尝试查询整个对象(如上面的确切示例),但没有成功。你确定这是可能的吗?文档中找不到相关信息。Frank,你能确认是否可能,并且如果是,请提供一个语法示例。 - Victor Dias
2
嗨@RenaduTamec,终于成功了,请求字段的名称拼错了。感谢您的支持,您的回复让我坚信并找到了解决方案。 - Victor Dias
2
@VictorDias 很酷!很高兴听到我能帮助到你。如果你认为我的回答有帮助,可以给我点赞!谢谢 - Renaud Tarnec
我认为目前(写作时)没有针对这种查询的任何新功能。 - Renaud Tarnec
1
很棒。在我的使用场景下运行良好。 - redshift
显示剩余10条评论

32

array-contains操作检查数组是否包含特定(完整)值。它无法检查对象数组中是否包含具有特定属性值的项。

执行查询的唯一方法是向文档添加一个额外字段,只用于存储您想要查询存在性的值。例如:partyMemberNames: ["John Travolta", "Olivia Newton"]


既然你说无法运行我提到的查询,那我就接受它作为答案,谢谢。 - sisi mendel

0
如果您控制文档结构,并且您查询的术语是唯一的且不包含特殊字符,您可以将数组转换为映射。
partyMembers {
  "7LNKFB9ql": "John Travolta": 
}

并使用例如 where('partyMembers.7LNKFB9ql', '!=', "") 进行查询。

有很多条件,但如果处理唯一的用户ID,这可能是一个选项。在OP的示例中,通过名称(“John Travolta”)而不是ID进行查询,这可能不太可行,但对于其他人可能是可行的。


-1
如果你想从一个文档的"partyMembers"数组中提取名字:"John Travolta",你可以通过一些类似的方法来循环遍历文档中的所有数组以找到这个名字。

const [names, setNames] = React.useState([])

const readAllNames = async() => {
const snapshot = await firebase.firestore().collection('identites').doc(documentID).get()
      const filterData = snapshot.data().question.map(val => val.name === "John Travolta" ? val : null)
      setNames( filterData.filter(e=>e) );
}

This technique is used in perticular Document as we are giving .doc(documentID) This way you can get all the arrays having name: "John Travolta" in names constant.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接