【问题标题】:How to read from multiple CosmosDB documents如何读取多个 CosmosDB 文档
【发布时间】:2019-12-25 16:14:32
【问题描述】:

我一直在试图弄清楚如何让我的列表从特定查询中读取。如果我注释掉其中一个 app.get 它从一个 DocumentDB 中读取,反之亦然。如何让它同时读取我的两个查询或指定一个列表从一个查询中读取,而另一个列表从第二个查询中读取?我尝试了第二个 querySpec,但不确定这是否可行。

谢谢

我能够从上一个问题中获得帮助。 Connecting to multiple CosmosDB documents

原教程: https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-nodejs-application#_Toc395783181

tasklist.js 中的代码

const TaskDao = require("../models/taskDao");

 class TaskList {
   /**
    * Handles the various APIs for displaying and managing tasks
    * @param {TaskDao} taskDao
    */
   constructor(taskDao,taskDao2) {
     this.taskDao = taskDao;
     this.taskDao2 = taskDao2;
   }

   async showList1(req, res) {
    const querySpec = {
      query: "SELECT * FROM root r WHERE r.List1=@List1",
      parameters: [
        {
          name: "@List1",
          value: "yes"
        }
      ]

    };

     const items = await this.taskDao2.find(querySpec);
     res.render("index", {
       title: "Form",
       tasks: items
     });

   }


   async showList2(req, res) {
    const querySpec2 = {
      query: "SELECT * FROM root r WHERE r.List2=@List2",
       parameters: [
         {
           name: "@List2",
           value: true
        }
      ]
    };

     const items = await this.taskDao.find(querySpec2);
     res.render("index", {
       title: "Form",
       tasks: items
     });

   }

   async addTask(req, res) {
     const item = req.body;

     await this.taskDao.addItem(item);
     res.redirect("/");
   }
 }

 module.exports = TaskList;

app.js 中的代码

app.get('/', (req, res, next) => taskList.showList1(req, res).catch(next))
app.get('/', (req, res, next) => taskList.showList2(req, res).catch(next))

我希望这些列表读取不同的值。

【问题讨论】:

  • 我不太清楚你想要什么。用户是否会在 List1 中选择一个选项,而 List2 是否会根据用户在 List1 中选择的内容从另一个集合中加载选项?
  • 我想从一个 DocumentDB 中读取一个列表,从另一个 DocumentDB 中读取第二个列表。集合不必基于先前的选择。所以每个列表都会有自己的查询。
  • 您好,我的回答解决了您的问题吗?
  • 有没有办法做这样的事情? async find(querySpec, querySpec2) { debug('Querying for items from the database') if (!this.container) { throw new Error('Collection is not initialized.') } const { resources } = await this.container.items.query(querySpec,querySpec2).fetchAll() return resources }
  • 嗨@williswin,如果我的回答对您有帮助,请将其标记为答案。对于您的进一步查询,请发布一个新问题,我会在第一时间为您提供帮助。顺便说一句,请在您的新查询中具体说明,以便我可以有效地为您提供帮助。谢谢!

标签: azure-cosmosdb


【解决方案1】:

如果您只想将数据从两个不同的容器加载到 HTML 选择器,您应该使用 res.send 而不是 res.render 来发送数据。

尝试以下步骤: 1. 去app.js这里添加两个路由代码:

 app.get('/list1', (req, res, next) => taskList.showTasks1(req, res).catch(next))
 app.get('/list2', (req, res, next) => taskList.showTasks2(req, res).catch(next)) 

2.转到routes/tasklist.js,添加showTasks1showTasks2(此代码基于我之前的答案taskDao2这里需要。):

   async showTasks1(req, res) {
    const items = await this.taskDao.find("SELECT * FROM root r ");
    res.send(items);
  }
  async showTasks2(req, res) {
    const items = await this.taskDao2.find("SELECT * FROM root r ");
    res.send(items);
  }

运行这个项目,你可以通过 URL 从你的两个容器中获取数据:

http://localhost:3000/list1http://localhost:3000/list2

最后,只需参考我的first answer for you 将数据加载到选择器。

希望对您有所帮助。如果您还有任何疑问,请随时告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2019-07-14
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多