我正在尝试运行一个简单查询,查询包含对象数组内值的文档。
例如,看看我的数据库结构:
db.collection('identites').where("partyMembers", "array-contains", {name: "John Travolta"})
如何以正确的方式实现这一点,使用Firestore是否可行?
谢谢。
例如,看看我的数据库结构:
db.collection('identites').where("partyMembers", "array-contains", {name: "John Travolta"})
谢谢。
正如Frank在他的回答中解释的那样,使用array-contains无法查询存储在数组中的对象的特定属性。
然而,有一个可能的解决方法:实际上可以按如下方式查询整个对象:
在您的情况下:
db.collection('identites')
.where(
"partyMembers",
"array-contains",
{id: "7LNK....", name: "John Travolta"}
)
也许这种方法能够满足您的需求(或者可能不行……)。array-contains
操作检查数组是否包含特定(完整)值。它无法检查对象数组中是否包含具有特定属性值的项。
执行查询的唯一方法是向文档添加一个额外字段,只用于存储您想要查询存在性的值。例如:partyMemberNames: ["John Travolta", "Olivia Newton"]
。
partyMembers {
"7LNKFB9ql": "John Travolta":
}
并使用例如 where('partyMembers.7LNKFB9ql', '!=', "")
进行查询。
有很多条件,但如果处理唯一的用户ID,这可能是一个选项。在OP的示例中,通过名称(“John Travolta”)而不是ID进行查询,这可能不太可行,但对于其他人可能是可行的。
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) );
}