2017-10-17 71 views
1

我有这个清单:a b c d e f g h i j。我想从列表中选取3个项目。如果我选择了e,结果列表应该是d e f,如果我选择了f,结果应该是e f g等等。在out如何在Google Firestore中进行分页?

console.clear() 
var pag = dbFirestore.collection("pagination") 
pag.doc("a").set({parent:"vowels"}) 
pag.doc("e").set({parent:"vowels"}) 
pag.doc("i").set({parent:"vowels"}) 
pag.doc("o").set({parent:"vowels"}) 
pag.doc("u").set({parent:"vowels"}) 
pag.doc("y").set({parent:"vowels"}) 
pag.doc("b").set({parent:"consonants"}) 
pag.doc("c").set({parent:"consonants"}) 
pag.doc("d").set({parent:"consonants"}) 
pag.doc("f").set({parent:"consonants"}) 
pag.doc("g").set({parent:"consonants"}) 
pag.doc("h").set({parent:"consonants"}) 
pag.doc("j").set({parent:"consonants"}) 
pag.doc("k").set({parent:"consonants"}) 
pag.doc("l").set({parent:"consonants"}) 
pag.doc("m").set({parent:"consonants"}) 
pag.doc("n").set({parent:"consonants"}) 
pag.doc("p").set({parent:"consonants"}) 
pag.doc("q").set({parent:"consonants"}) 
pag.doc("r").set({parent:"consonants"}) 
pag.doc("s").set({parent:"consonants"}) 
pag.doc("t").set({parent:"consonants"}) 
pag.doc("v").set({parent:"consonants"}) 
pag.doc("w").set({parent:"consonants"}) 
pag.doc("x").set({parent:"consonants"}) 
var siblings = ref => { 
    var out = [] 
    return pag.orderBy("parent").endAt(ref).limit(3).get().then(snap=>{ 
     snap.forEach(doc=>out.push(doc.id)) 
     return 
    }).then(()=>{ 
     return pag.orderBy("parent").startAfter(ref).limit(2).get().then(snap=>{ 
     snap.forEach(doc=>out.push(doc.id)) 
     return out 
     }) 
    }) 
} 
siblings(pag.doc("m")).then(out=>{ 
    console.log(out) 
}).catch(e=>console.error(e)) 

随着sibling("m").then(out=>console.log(out))我应该有k l m n p,他们都有parent:"consonants"k l m第一个查询与n p从第二查询相结合,但我有别的东西:

我做了这个例子。

回答

0

问题出在您形成查询的方式。 startAt,endAt等在您传递给orderBy的字段上进行操作。所以如果你做.orderBy("parent").startAt("foo")这是说“按doc.parent的值排序所有文档,从doc.parent == foo开始”。

所以你必须在这里做一些改变。首先,它会更容易查询,如果您存储文档在信的价值,所以你的文件看起来是这样的:

{ 
    "val": "a", 
    "parent": "vowels" 
} 

然后你就可以做到这一点查询:

/** 
* ex: siblingsOf("a", "vowels"); 
*/ 
function siblingsOf(letter, parent) { 
    var out = []; 

    // Starting at the letter, read "up" three documents 
    var threeBefore = pag.where("parent", "==", parent) 
     .orderBy("val", "desc").startAt(letter).limit(3); 

    // Starting after the letter, read "down" three documents 
    var twoAfter = pag.where("parent", "==", parent) 
     .orderBy("val").startAfter(letter).limit(2); 

    return threeBefore.get().then(snap => { 
    // Add to beginning of array 
    snap.forEach(doc => out.unshift(doc.data())); 
    }).then(() => { 
    return twoAfter.get().then(snap => { 
     // Add to end of array 
     snap.forEach(doc => out.push(doc.data())); 

     return out; 
    }); 
    }); 
} 

所以如果我没有siblingsOf("j", "consonants")我会得到"g", "h", "j", "k", "l"的文件。

+0

我向所有文档添加了“{val:letter}”。 'startAfter(letter)'按预期工作得到'np',但是:'pag.where(“parent”,“==”,“consonants”)。orderBy(“val”)。endAt(“m”)。limit (3)'get'bcd'前3个辅音,而不是前面'kl'加'm' –

+0

@AlinC是的,你是对的我犯了一个错误。在使用'endAt'和'limit'的属中并不是一个好主意,因为查询结果将以这些更强的约束中的任何一个结束。让我更新。 –

+0

我认为我们已经使用'unshift'而不是'push'来代替'threeBefore',因为我们得到了'm l k n p'而不是'k l ​​m n p'。我会尽量自我更新你的答案。我无法编辑它,我必须编辑更多,然后像6个字符。无论如何,我知道如何分页知道,谢谢。 –

0

在firebase上有Pagination & Query的文档。我们必须使用startAt()或startAfter()方法来定义查询的起始点。同样,使用endAt()或endBefore()方法为查询结果定义一个结束点。