我们正在使用
cloud_firestore
Flutter 包(刚刚升级到 4.9.3),并且在将 Filter.or 与 arrayContains: documentReference 一起使用时遇到错误。具体错误信息是Invalid argument: Instance of '_JsonDocumentReference'
这是查询:
.where(
Filter.and(
Filter(PostKeys.type, whereIn: [PostType.creation.name, PostType.combination.name]),
Filter(PostKeys.visibility, isEqualTo: ContentVisibility.public.name),
Filter.or(
Filter(PostKeys.ingredients, arrayContains: itemReference),
Filter(PostKeys.tags, arrayContains: itemReference)
)
)
)
.orderBy(PostKeys.created, descending: true)
.limit(queryLimit);
结果:
Invalid argument: Instance of '_JsonDocumentReference'
即使我们删除 Filter.or 并只包含 Filter.and 中的语句之一,我们也会得到相同的错误:
.where(
Filter.and(
Filter(PostKeys.type, whereIn: [PostType.creation.name, PostType.combination.name]),
Filter(PostKeys.visibility, isEqualTo: ContentVisibility.public.name),
Filter(PostKeys.ingredients, arrayContains: itemReference),
)
)
.orderBy(PostKeys.created, descending: true)
.limit(queryLimit);
结果:
Invalid argument: Instance of '_JsonDocumentReference'
cloud_firestore
版本4.9.2
的变更日志状态为“FIX(firestore):允许在过滤器查询中使用 DocumentReference”,但它似乎不起作用,我们不确定为什么。
作为参考,我们在 Prototype 环境中使用 Javascript 运行相同的查询,并且运行良好:
pq = query(collection(db, "posts"),
and(
where('type', "in", ['creation','combination']),
where("visibility", "==", CONSTANTS.visibility.public),
or(
where('ingredients', "array-contains", itemRef),
where('tags', "array-contains", itemRef)
)
),
orderBy("created","desc"),
limit(queryLimit)
);
结果:在 Javascript (WebV9) 中运行良好
已解决
我能够使查询正常工作。根据 @Frank 对我原来问题的评论,我检查了 DocumentReference 的初始化,结果是
final itemReference = _itemsCollection.doc(item.reference.id);
。相反,我只是将现有的 item.reference
传递到查询中并且它起作用了。不知道为什么会产生影响,但确实如此。