当前位置: 首页 > 知识库问答 >
问题:

使用Javascript从Firestore获取随机文档 [重复]

牟慎之
2023-03-14

我已经阅读了一个关于随机java的文档,swift但JS随机文档firestore我找不到,我看到这个问题还没有为JS?

迅速

postsRef.whereField("random", isGreaterThanOrEqualTo: random)
                   .order(by: "random")
                   .limit(to: 1)

JS

postsRef.where("random", ">=", random)
                   .order("random")
                   .limit(1)

这是正确的吗?

共有1个答案

柯新翰
2023-03-14

Typescript(如果使用Javascript,请删除类型)版本,用于使用随机整数(和环绕)获取随机文档。这个答案使用云函数进行测试,但实际上您只需要复制getDocuments函数。

export const getRandomDoc = functions.https.onRequest(async (req, res): Promise<any> => {
  try {
    const randomDocs = await getDocuments(2)
    return res.send(randomDocs)
  } catch (err) {
    return res.send(err)
  }
});

const getDocuments = async (count: number): Promise<Array<FirebaseFirestore.DocumentData>> => {
  const randomNum = Math.floor(Math.random() * 10000)
  const snapshot = await admin.firestore().collection("col").where("rInt", ">=", randomNum).limit(count).get()
  if (snapshot.empty) {
    return getDocuments(count)
  }
  return snapshot.docs.map(d => d.data())
}

每当向html" target="_blank">集合中添加一个新文档时,添加< code>rInt字段,该字段是一个0到10000之间的整数(包括0和10000)。您可以在< code>getDoucments函数中传递所需的文档数量。它将获取N个连续的匹配文档,因为它使用了< code>limit()方法。

在查询中,我们查找rInt大于或等于使用Math.random()生成的随机数的文档,并将结果限制为函数中传递的count参数。如果快照为空,我们重试函数。(值得添加一个逻辑,使此函数仅重复N次,否则递归将花费它的时间)。

使用。上面函数中的limit()最终将一行返回N个文档。默认情况下,文档将按其文档ID排序,除非您使用orderBy方法指定任何特定字段。相反,对每个文档单独提出请求将增加随机性。

/**
 * @param {number} count - number of documents to retrieve
 * @param {number} loopNum - number of times the loop is being repeated. Defaults to 0 
 * @param {Array<any>} curDocs - array of documents matched so far. Defaults to an empty array
 * @returns 
 */ 
const getDocuments = async (count: number, loopNum: number, curDocs: Array<any>): Promise<Array<FirebaseFirestore.DocumentData>> => {
  // Creating an array of requests to get documents
  const requests = []
  for (let i = 0; i < count; i++) {
    // New random number for each request
    const randomNum = Math.floor(Math.random() * 10000)
    console.log(`Random Num: ${randomNum}`);
    requests.push(admin.firestore().collection("col").where("rInt", ">=", randomNum).limit(1).get())
    // limit is set to 1 so each request will return 1 document only
  }
  
  // Using Promise.all() to run all the promises
  const snapshots = await Promise.all(requests)
  
  // Removing empty snapshots
  const filteredSnapshots = snapshots.filter(d => !d.empty)

  // Creating an array of doc data
  const matchedDocs = filteredSnapshots.map(doc => doc.docs[0].data())
  
  // If documents received are less than requested,
  // repeat the function
  if (matchedDocs.length !== count) {
    // If the function is repeated 5 times,
    // return with whatever has matched so far
    if (loopNum + 1 === 5) {
      console.log("Returning CurDocs")
      return curDocs
    }
    return getDocuments(count, loopNum + 1, [...curDocs, ...matchedDocs])
  }
  
  // Return if you get requested num of docs in first go
  return snapshots.map(d => d.docs[0].data())
}

// Calling the function
getDocuments(5, 0, [])

请注意,如果您请求的文档少于或等于10个,则可以使用< code>in运算符。in运算符使用逻辑or在同一个字段中组合多达10个相等(==)子句。

对于@Dan McGrath的原始版本(swift),请检查此答案。

 类似资料:
  • 例如:是Firestore中的一个集合,我在该集合中有1000名学生,我的要求是在每次调用中随机选择10名学生。

  • 因此,我在Firestore上创建了一个包含文档列表的数据,我想在调用Android活动时随机检索一个文档。 例如,我在收藏“人物”中有以下一组文档 亚历克斯 阿披舍克 南迪尼 南希 在我的Android活动中,我有一个文本视图,它将随机显示每个集合名称,每当我调用该活动时,比如当我打开活动时,它将在文本视图上显示“Nancy”,再次打开时,它会显示“Abhishek!” 希望你理解我的问题,这将

  • 问题内容: 对于我的应用程序而言,至关重要的是能够从Firebase的集合中随机选择多个文档。 由于Firebase(我知道)没有内置本机函数来实现执行此操作的查询,因此我的第一个想法是使用查询游标选择随机的起始索引和终止索引,前提是我拥有​​其中的文档数集合。 这种方法行之有效,但只能以有限的方式进行,因为每次每次文档都会与其相邻文档一起依次送达。但是,如果我能够通过其父集合中的索引选择一个文档

  • 如何对集合中的文档进行随机排序? 这是我用来获取文档的函数,如何对它们进行随机排序?

  • 问题内容: 考虑: 如何使用JavaScript从此数组中选择随机值? 问题答案: 这是一个简单的单线 例

  • 问题内容: var items = Array(523,3452,334,31,…5346); 如何获得随机物品? 问题答案: