gpt4 book ai didi

javascript - 在 Firestore 查询中按不同字段使用 Where 和 Order

转载 作者:行者123 更新时间:2023-12-05 00:36:21 25 4
gpt4 key购买 nike

我有一个名为 channels 的 Firestore 集合,我想根据 ID 数组获取 channel 列表,并按 createdAt 排序字段,这是我的功能:

  const getChannels = () => {
const q = query(
collection(db, "channels"),
where(documentId(), "in", [
"F0mnR5rNdhwSLPZ57pTP",
"G8p6TWSopLN4dNHJLH8d",
"wMWMlJwa3m3lYINNjCLT",
]),
orderBy("createdAt")
);
const unsubscribe = onSnapshot(q, (snapshot) => {
snapshot.docs.map((doc) => {
console.log(doc.data());
});
});
return unsubscribe;
};
但我收到了这个错误 FirebaseError: inequality filter property and first sort order must be the same: __name__ and createdAt .
只有在我订购时才有效通过 documentId() .
我知道 docs 中有一个限制。关于这一点,但我想知道这种情况是否有解决方法。
也是这个 question的答案我猜不再工作了。

最佳答案

您的问题标题表明您正在尝试使用 whereorderBy针对不同的领域。但请注意,您使用的是 documentId()在要过滤的 where 条件中,这不是 Firestore 文档中的字段。
所以如果你过滤是基于documentId() ,您只能使用 documentId()orderBy()子句,也按升序排列,因为目前 Firestore 不支持按 documentId() 的降序排序this answer 中提到.
让我们看看下面的例子——

const data=await db.collection("users").where(admin.firestore.FieldPath.documentId(),"in",["104","102","101"]).orderBy(admin.firestore.FieldPath.documentId()).get();
以上将根据 documentId() 对文档进行排序和排序。基于 documentId()过滤后.
但申请 orderBy() 无关紧要基于 documentId() 的子句, 因为没有应用 orderBy()子句也产生相同的结果,默认情况下,Firestore 查询以 documentId() 的升序给出文档.这意味着以下也产生相同的结果 -
const data=await db.collection("users").where(admin.firestore.FieldPath.documentId(),"in",["104","102","101"]).get();
现在 Firestore 不支持按 documentId() 的降序排序这意味着以下内容将不起作用 -
const data=await db.collection("users").where(admin.firestore.FieldPath.documentId(),"in",["104","102","101"]).orderBy(admin.firestore.FieldPath.documentId(),"desc").get();
这将要求创建一个索引 -
The query requires an index. You can create it here:
但是如果你去那里创建一个索引,它会说 -
__name__ only indexes are not supported.
现在让我们来看看您的问题。您要做的是根据 documentId() 进行过滤然后 orderBy()基于 createdAt这是不可能的字段,它将给出以下错误-
inequality filter property and first sort order must be the same.
您可能会考虑使用两个 orderBy()子句,像这样 -
const data=await db.collection("users").where(admin.firestore.FieldPath.documentId(),"in",["104","102","101"]).orderBy(admin.firestore.FieldPath.documentId()).orderBy(“createdAt”
).get();
哪个不起作用并给出以下错误
order by clause cannot contain more fields after the key
我不确定您的用例,但根据 documentId() 进行过滤不是一个好主意.如果需要根据 documentId()过滤,我建议在 Firestore 文档中创建一个字段,该字段将包含 documentIds 和基于此的过滤器。
现在考虑问题的标题,是的,可以对 Firestore 中的不同字段使用 where() 和 orderBy() 子句。有一些 limitations你需要坚持这一点-

If you include a filter with a range comparison (<, <=, >, >=), your first ordering must be on the same field.

const data=await db.collection("users").where(“number”,">=", “101”).orderBy(“createdAt”).get(); 
上面的查询不起作用。
const data=await db.collection("users").where(“number”,">=", “101”).orderBy(“number”).get(); 
上述查询有效,您仍然可以进一步使用 orderBy()在不同的领域,如下所示 -
const data=await db.collection("users").where(“number”,">=", “101”).orderBy(“number”).orderBy(“createdAt”).get(); 

You cannot order your query by any field included in an equality (=) or in clause.

const data=await db.collection("users").where(“number”,"in",["104","102","101"]).orderBy(“number”).get();
const data=await db.collection("users").where(“number”,"==", “101”).orderBy(“number”).get();
以上两个都不行。

关于javascript - 在 Firestore 查询中按不同字段使用 Where 和 Order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70148800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com