Firestore启动后,最后一个快照不起作用,如果2个或更多文档具有相同的字段值

我有一个名为“ 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).]
xiefeiyang 回答:Firestore启动后,最后一个快照不起作用,如果2个或更多文档具有相同的字段值

这是react-native-firebase库中的错误。请查看issue on Github,以进行后续操作。现在,该问题已标记为已修复,并且此修复程序将包含在下一个版本(> 5.5.6)中。


下面的旧答案...


您传递到startAfter的文档需要包含Firestore所需的所有内容,以决定下一个从何处开始。如果您要过滤的字段在集合中不是唯一的,则DocumentSnapshot还需要包含文档的ID。如果您的查询显示的是符合条件的第一个或第二个文档,而不是要查找的第二个文档,则最有可能是因为lastDocument中缺少ID。


更新后,我尝试使用以下代码重现该问题:

var db = firebase.firestore();
var ref = db.collection("58783480").orderBy('number','desc');
ref.get().then(function(snapshot) {
  console.log("Got all results");
  snapshot.forEach(function(doc) {
    console.log(doc.id+' => '+JSON.stringify(doc.data()));
  });  
  var last;
  ref.limit(2).get().then(function(snapshot) {
    console.log("Got first page");
    snapshot.forEach(function(doc) {
      console.log(doc.id+' => '+JSON.stringify(doc.data()));
      last = doc;
    });
    ref.startAfter(last).limit(2).get().then(function(snapshot) {
      console.log("Got second page");
      snapshot.forEach(function(doc) {
        console.log(doc.id+' => '+JSON.stringify(doc.data()));
        last = doc;
      });
    });
  })
});

实时示例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}

     

获得第二页

     

8Ek8iWCDQPPJ5s2n8PiQ => {“索引”:4,“数字”:2}

     

mr7MdAygvuheF6AUtWma => {“索引”:1,“数字”:1}

本文链接:https://www.f2er.com/3131298.html

大家都在问