【问题标题】:union on same collection in mongodbmongodb中同一集合的联合
【发布时间】:2013-02-18 10:32:35
【问题描述】:

我需要最可行的方法来搜索具有以下结构的文档。

{ _id:"",
var1: number,
var2: number,
var3: number,
}

在 sql 方式中,我需要的结果集是这三个的 UNION(n 条记录按 var1 排序,n 条记录按 var2 排序,n 条记录按 var3 排序)

使用 UNION,我希望删除重复项。

作为 mongodb 的新手,我无法找到为此类操作编写查询的正确方法,我相信在 mongodb 中一定可以。

如果不可能,您能否建议一个替代的 nosql 解决方案。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    与您正在寻找的最接近的 MongoDB 运算符是 $or,但这与将两个单独的查询组合成一个结果的 SQL UNION 不太一样。 MongoDB 查询始终针对单个集合,但$or 允许您拥有多个查询子句。

    例如:

    db.collection.find(
        // Find documents matching any of these values
        {$or:[
            {var1: 123},
            {var2: 456},
            {var3: 789}
        ]}
    ).sort(
        // Sort in ascending order
        {var1:1, var2:1, var3:1}
    )
    

    由于您仅限于查询单个集合,因此已经在文档级别对结果进行了重复数据删除,并且如果指定了一个排序顺序,所有结果将共享相同的排序顺序。

    如果您想在 MongoDB 中模拟 UNION(或使用多个集合/查询的其他操作),则必须编写多个查询并在应用程序代码中合并结果集。

    【讨论】:

    • 问题在于排序和限制。我只需要每组的前 n 条记录。无论如何,我认为它在 mongodb 中是不可能的,我将通过多个查询来完成。我对您编写的排序有另一个查询,{var1:-1, var2:-1, var3:-1} 是否意味着将考虑所有三个作为一个排序结果。 A = {"var1":3,"var2":8,"var3":11} B = {"var1":4,"var2":6,"var3":9} C = {"var1":4 ,"var2":7,"var3":2} 将导致 A(var3=11),B(var3=9),C(var2=7) 或 C(var2=7),B(var2=6) ,A(var1=3)
    • 是的 .. 如果您想从每个查询中采样,您将不得不执行多个查询并将结果合并到您的代码中。对于排序顺序,最简单的比较方法是在 shell 中尝试一个示例:)。您使用带有“-1”的字段的规范将按该字段的降序排序(1 表示升序)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多