我有一个名为“ test”的集合,其中包含多个文档。 每个文档都有一个唯一的名称和一个数字字段。 我已经使用查询游标实现了分页。获取初始文档的查询如下:
let lastDocument={};
ref.collection("test").orderBy('number','desc').limit(3).get()
.then(snapshot => {
lastDocument = snapshot.docs[snapshot.docs.length-1];
})
.catch(err => {
console.log("Error getting documents",err);
});
获取lastDocument后,我将其分页如下:
ref.collection("test").orderBy('number','desc').startAfter(lastDocument).limit(3); //lastDocument has the last document of the snapshot that was retrieved.
在我的集合中,如果有2个或多个文档具有相同的“字段”字段值,那么我不会在查询结果中得到该文档。而如果更改“数字”字段的值,以使所有文档唯一,则可以正确地(根据limit子句)分批获取所有结果。
文档中也提到,如果多个字段具有相同的填充值,则该查询将不起作用https://firebase.google.com/docs/firestore/query-data/query-cursors#paginate_a_query
我应该如何修改查询,以获取结果中的所有文档,即使orderBy中使用的字段的2个或更多文档具有相同的值?
我正在使用:
"react-native-firebase": "^5.5.6","react-native": "^0.59.8","firebase": "^6.6.1",
更新:我已经测试了jsbin上的查询,并且返回正确 结果。我在与本机应用程序一起使用时遇到问题 react-native-firebase库。我已经认识到的模式 如下:假设有如下文件 {id:a,num:1},{id:b,num:2},{id:c,num:2},{id:d,num:2},{id:e,num:3}, {id:f,num:4} 然后,如果我用orderBy('num','desc')和限制查询第一个集合 作为2,我得到[a,b]。现在,如果我用startAfter最后一个查询 文档为“ b”且限制为2,则它将跳过所有文档 在b之后,其编号与b相同(即2)。因此,它将跳过文档 [c,d],然后还给我[e,f]。这在jsbin上很好用,但在react上不起作用 原生使用react-native-firebase库。
请在下面的react-native上找到代码here的确切输出:
“获得所有结果”
“ wbXwyLJheRfYXXWlY46j => {\”索引\“:2,\”数字\“:2}”
“ kGC5cYPN1nKnZCcAb9oQ => {\”索引\“:6,\”数字\“:2}”
“ 8Ek8iWCDQPPJ5s2n8PiQ => {\”索引\“:4,\”数字\“:2}”
“ mr7MdAygvuheF6AUtWma => {\”索引\“:1,\”数字\“:1}”
“ RCO5SvNn4fdoE49OKrIV => {\”索引\“:3,\”数字\“:1}”
“ CvVG7VP1hXTtcfdUaeNl => {\”索引\“:5,\”数字\“:1}”
“获得首页”
“ wbXwyLJheRfYXXWlY46j => {\”索引\“:2,\”数字\“:2}”
“ kGC5cYPN1nKnZCcAb9oQ => {\”索引\“:6,\”数字\“:2}”
“获得第二页”
“ mr7MdAygvuheF6AUtWma => {\”索引\“:1,\”数字\“:1}”
“ RCO5SvNn4fdoE49OKrIV => {\”索引\“:3,\”数字\“:1}”
请注意,它已跳过:“ 8Ek8iWCDQPPJ5s2n8PiQ => {\” index \“:4,\” number \“:2}”
在react-native-firebase库中遇到了另一个问题: 如果文档如下所示,则为地图结构:
{
subscribedUsers:{
+1656666:true,+1657878:false,+1677676:true
}
}
现在,如果我触发如下查询:
db.collection(“ ownerUsers”)。where(
subscribedUsers.${phonenumber}
, '==',true).limit(3).get();
查询返回3个结果。现在,如果我尝试使用如下所示的startAfter子句获得下3个结果,则它可以与firebase一起使用,但不适用于react-native-firebase库:
db.collection(“ ownerUsers”)。where(subscribedUsers。$ {phonenumber},'==',true).startAfter(last).limit(3).get()
然后出现以下错误:
[Info] 11-10 21:38:42.631 21908 21967 I ReactNativeJS: 'Error getting documents',{ [Error: Firestore: Client specified an invalid argument. (firestore/invalid-argument).]