在Cosmos上提供不同结果的查询(与Pure Mongo相比)

时间:2019-08-23 16:52:33

标签: mongodb azure-cosmosdb azure-cosmosdb-mongoapi

我有一个具有以下文档结构的Mongo集合:-

{
    "_id" : ObjectId("5d5e5f1dfc325d4018302293"),
    "status" : "PENDING",
    "workflowJourney" : [ 
        {
            "_id" : ObjectId("5d5e5f1dfc325d401830229c"),
            "workflowDate" : ISODate("2019-08-22T09:23:41.491Z"),
            "workflowType" : "Email",
            "workflowDescription" : "Email sent to Joe Bloggs",
            "workflowRecipient" : {
                "employeeNumber" : "12345",
                "firstName" : "Joe",
                "surname" : "Bloggs",
                "emailAddress" : "joe.blogs@example.com"
            },
            "workflowSubject" : "Invoice Approval Required (2112)",
            "workflowHtmlContent" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitiona..."
        }, 
        {
            "_id" : ObjectId("5d5e5f1dfc325d401830229d"),
            "workflowDate" : ISODate("2019-08-22T09:23:41.507Z"),
            "workflowType" : "Email",
            "workflowDescription" : "Email sent to Jane Bloggs",
            "workflowRecipient" : {
                "employeeNumber" : "56789",
                "firstName" : "Jane",
                "surname" : "Bloggs",
                "emailAddress" : "jane.bloggs@example.com"
            },
            "workflowSubject" : "Invoice Approval Required (2112)",
            "workflowHtmlContent" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitiona..."
        }
    ],
    "approvals" : [],
    "__v" : 1
}

我正在尝试创建一个查询,该查询将获得一个工作流程旅程。在执行查询时,我已经知道主文档和工作流旅程子文档的_id,因此我可以在查询中使用这两个。

问题是,对于这个开发项目,我们正在使用Azure Cosmos,而我希望可以进行的查询给出了奇怪的结果。

如果我在纯Mongo中运行它:-

db.getCollection('Invoices').find(
 {"workflowJourney._id": ObjectId("5d5e5fd907ba93320cc54198")},
 {"workflowJourney.$": 1.0}
);

我得到了一个不错的结果:-

{
    "_id" : ObjectId("5d5e5f1dfc325d4018302293"),
    "workflowJourney" : [ 
        {
            "_id" : ObjectId("5d5e5f1dfc325d401830229d"),
            "workflowDate" : ISODate("2019-08-22T09:23:41.507Z"),
            "workflowType" : "Email",
            "workflowDescription" : "Email sent to Jane Bloggs",
            "workflowRecipient" : {
                "employeeNumber" : "56789",
                "firstName" : "Jane",
                "surname" : "Bloggs",
                "emailAddress" : "jane.bloggs@example.com"
            },
            "workflowSubject" : "Invoice Approval Required (2112)",
            "workflowHtmlContent" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitiona..."
        }
    ]
}

在Azure Cosmos中运行相同的查询(数据库包含相同的数据),我得到以下信息:-

{
    "_id" : ObjectId("5d5e5f1dfc325d4018302293"),
    "workflowJourney" : [ 
        {}, 
        {}
    ]
}

因此,没有有用的结果。我知道Cosmos DB更像是Mongo模拟器,而不是纯实现。但是我想我要实现的是一个相当普遍的情况。我想知道是否有人对如何重新编写查询以获得所需的结果有任何建议?

非常感谢 格伦

1 个答案:

答案 0 :(得分:0)

好的,所以我已经通过从Node级别进行过滤实现了我需要做的事情。我想过滤查询实际上是为返回整个文档而不是从单个文档中过滤信息而设计的。

示例:-

router.get('/emailPreview/:invoiceId/:workflowJourneyItemId', (req, res, next) => {
  Invoice.findOne({ "_id": req.params.invoiceId })
  .then(invoice => {

    if(invoice) {
      const emailHtml = invoice.workflowJourney.filter((item) => {
        return item.id === req.params.workflowJourneyItemId;
      })[0].workflowHtmlContent;

    res.status(200).set('Content-Type', 'text/plain').send(emailHtml);
    } else {
      res.status(404).json({ Error: 'Email not found'});
    }

  }).catch(err => {
     res.status(404).json({ Error: 'Email not found'});
  })
});