mongodb - 比较两个 MongoDB 集合之间的文档

标签 mongodb join

我有两个现有集合,需要根据两个现有集合之间的比较来填充第三个集合。

需要比较的两个集合具有以下架构:

// Settings collection:
{
  "Identifier":"ABC123",
  "C":"1",
  "U":"V",
  "Low":116,
  "High":124,
  "ImportLogId":1
}

// Data collection
{
  "Identifier":"ABC123",
  "C":"1",
  "U":"V",
  "Date":"11/6/2013 12AM",
  "Value":128,
  "ImportLogId": 1
}

总的来说,我是 MongoDB 和 NoSQL 的新手,所以我很难掌握如何做到这一点。 SQL 看起来像这样:

SELECT s.Identifier, r.ReadValue, r.U, r.C, r.Date
FROM Settings s
JOIN Reads r
  ON s.Identifier = r.Identifier
  AND s.C = r.C
  AND s.U = r.U
WHERE (r.Value <= s.Low OR r.Value >= s.High)

在这种使用示例数据的情况下,我想返回一条记录,因为数据集合中的值大于设置集合中的高值。这是否可以使用 Mongo 查询或 map reduce,还是这种糟糕的集合结构(即,可能所有这些都应该在一个集合中)?

还有一些补充说明: Settings 集合实际上应该每个“标识符”只有 1 条记录。数据集合将有每个“标识符”的许多记录。此过程可能一次扫描数十万份文档,因此资源考虑有些重要

最佳答案

没有使用 MongoDB 执行此类操作的好方法。如果你想要 BAD 方式,你可以使用这样的代码:

db.settings.find().forEach(
    function(doc) {
        data = db.data.find({
            Identifier: doc.Idendtifier,
            C: doc.C,
            U: doc.U,
            $or: [{Value: {$lte: doc.Low}}, {Value: {$gte: doc.High}}]
        }).toArray();
        // Do what you need
    }
) 

但不要期望它的性能会与任何体面的 RDBMS 一样好。

您可以像这样从数据收集中重建架构并嵌入文档:

{
    "_id" : ObjectId("527a7f4b07c17a1f8ad009d2"),
    "Identifier" : "ABC123",
    "C" : "1",
    "U" : "V",
    "Low" : 116,
    "High" : 124,
    "ImportLogId" : 1,
    "Data" : [
        {
            "Date" : ISODate("2013-11-06T00:00:00Z"),
            "Value" : 128
        },
        {
            "Date" : ISODate("2013-10-09T00:00:00Z"),
            "Value" : 99
        }
    ]
}

如果嵌入文档的数量很少,它可能会起作用,但说实话,处理文档数组远非愉快的体验。更不用说随着 Data 数组大小的增加,您可以轻松达到文档大小限制。

如果这种操作对于您的应用程序来说是典型的,我会考虑使用不同的解决方案。尽管我很喜欢 MongoDB,但它只适用于某些类型的数据和访问模式。

关于mongodb - 比较两个 MongoDB 集合之间的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19817275/

相关文章:

mongodb - 将一个值添加到mongo集合中的数组的脚本

javascript - 使用 Web 套接字存储数据时 NodeJS 可能具有最佳性能

node.js - Mongoose 通过 ObjectId 查找

node.js - 在 Mongodb 中使用 $exists 以及动态键名称和 Node 的 native 驱动程序

php - 在 MySQL 中连接 3 个表会产生带有值的重复行

javascript - Node.JS 查询 MongoDB 返回 null

mysql - 即使查询为 NULL,如何返回所有行

mysql - SQL JOIN 第一行与 CONCAT_WS

mysql - 使用最小列值创建左连接?

java - 如何从 PCollection<String> 创建 PCollection<Row> 以执行波束 SQL 转换