0

我正在使用带有简单自定义查询功能的 mongodb 领域来返回数据库数据

  function mongo(data) {
    return fetch(
      apiurl,
    {
      method: "POST",
       headers: {
          "Content-Type": "application/json",
       },
        body: JSON.stringify(data),
       }
    )
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      console.log("Success:", data);
      return data;
    })
    .catch((error) => {
      console.error("Error:", error);
    });
  }

  mongo({
    collection: "metadata",
    action: "find",
    criteria: { query: {}},
  }).then((metadata) => {
    for (var i = 0; i < metadata.length; i++) {
      var oneMeta= metadata[i];
      var subjectName = oneMeta.name;
      var subjectCode = oneMeta.code;
      var blockHTML =
        `<div>
        <span class="badge badge-danger">` + subjectName + `</span>
        <span class="badge badge-dark">` + subjectCode + `</span>
        </div>`;
      var oneSubject = document.createElement("div");
      oneSubject.id = "sub_"+subjectCode 
      oneSubject.innerHTML = blockHTML;
      subjectOutput.appendChild(oneSubject);
    }
  });

我试图对每个来自哪里做另一个mongo({collection: "actualData", action: "count", criteria: { query: {subjectId: XXX}}})查询 metadataXXXsubjectCodemetadata[i]

目标是使用其 id 将另一个附加<span>count</span>到上面创建的 DIV,其中计数是第二个mongo函数的结果。

我只能在没有循环的情况下做到这一点metadata.length

我需要在循环中的每次执行下一个函数,同时使用imetadata

任何帮助表示赞赏!

4

1 回答 1

0

只需将您映射到一个承诺metadata数组,所有这些,然后计数结果将在数组的相同位置:mongoawait

mongo({
    collection: "metadata",
    action: "find",
    criteria: { query: {}},
  }).then(async (metadata) => {
    const counts = await Promise.all(metadata.map((oneMeta) => {
      return mongo({collection: "actualData", action: "count", criteria: { query: {subjectId: oneMeta.subjectCode}}});
    }));
    for (let i = 0; i < metadata.length; i++) {
      const count = counts[i];
      const oneMeta = metadata[i];
      const subjectName = oneMeta.name;
      const subjectCode = oneMeta.code;
      var blockHTML =
          `<div>
          <span class="badge badge-danger">` + subjectName + `</span>
          <span class="badge badge-dark">` + subjectCode + `</span>
          <span class="badge badge-dark">` + count + `</span>
          </div>`;
      var oneSubject = document.createElement("div");
      oneSubject.id = "sub_"+subjectCode 
      oneSubject.innerHTML = blockHTML;
      subjectOutput.appendChild(oneSubject);
    }
})

于 2021-06-10T23:19:58.450 回答