Firestore 按数组的字段值查询
Firestore to query by an array's field value
我正在尝试 运行 一个简单的查询,我在其中搜索包含对象数组中的值的文档。
比如看我的数据库结构:
我想运行一个类似这样的查询:
db.collection('identites').where("partyMembers", "array-contains", {name: "John Travolta"})
实现此目标的正确方法是什么,使用 Firestore 是否可行?
谢谢。
array-contains
操作检查数组是否包含特定(完整)值。它无法检查对象数组是否包含具有 属性.
特定值的项目
进行查询的唯一方法是在文档中添加一个附加字段,其中仅包含您要查询存在的值。例如:partyMemberNames: ["John Travolta", "Olivia Newton"]
.
正如弗兰克在他的回答中所解释的那样,使用数组包含查询存储在数组中的对象的特定 属性 是不可能的。
但是,有一个可能的解决方法:实际上可以查询 整个对象,如下所示,在您的情况下:
db.collection('identites').where("partyMembers", "array-contains", {id: "7LNK....", name: "John Travolta"})
也许这种方法适合您的需要(或者可能不适合......)。
如果您想从文档的“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) );
}
这种技术在特定的文档中使用,因为我们给出了 .doc(documentID) 这样你就可以获得名称常量中名称为“John Travolta”的所有数组。
我正在尝试 运行 一个简单的查询,我在其中搜索包含对象数组中的值的文档。
比如看我的数据库结构:
我想运行一个类似这样的查询:
db.collection('identites').where("partyMembers", "array-contains", {name: "John Travolta"})
实现此目标的正确方法是什么,使用 Firestore 是否可行?
谢谢。
array-contains
操作检查数组是否包含特定(完整)值。它无法检查对象数组是否包含具有 属性.
进行查询的唯一方法是在文档中添加一个附加字段,其中仅包含您要查询存在的值。例如:partyMemberNames: ["John Travolta", "Olivia Newton"]
.
正如弗兰克在他的回答中所解释的那样,使用数组包含查询存储在数组中的对象的特定 属性 是不可能的。
但是,有一个可能的解决方法:实际上可以查询 整个对象,如下所示,在您的情况下:
db.collection('identites').where("partyMembers", "array-contains", {id: "7LNK....", name: "John Travolta"})
也许这种方法适合您的需要(或者可能不适合......)。
如果您想从文档的“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) );
}