【问题标题】:Query providing different results on Cosmos (vs Pure Mongo)在 Cosmos 上提供不同结果的查询(vs Pure Mongo)
【发布时间】:2019-08-23 16:52:33
【问题描述】:

我有一个具有以下文档结构的 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
}

我正在尝试创建一个查询,该查询将获得一个 workflowJourney。在执行查询时,我已经知道主文档和 workflowJourney 子文档的 _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 模拟器,而不是纯粹的实现。但我想我想要实现的是一个相当普遍的场景。我想知道是否有人对我如何重新编写查询以获得我需要的结果有任何建议?

非常感谢 格伦

【问题讨论】:

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


    【解决方案1】:

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

    例子:-

    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'});
      })
    });
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2015-08-13
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多