MongoDB查询用于聚合唯一字段上的动态文档

时间:2016-02-04 12:44:21

标签: java node.js mongodb nosql

关于这个问题有很多问题,但是没有一个问题能回答我的问题,所以这里有:

如何查找具有唯一值的文档,然后返回完整的文档?

我看过例如所有类似问题的this questionthe answers似乎都说同样的话。使用aggregation

我遇到的问题是我有一个数据库,其中文档在字段之间有一些区别,并且可能在稍后阶段出现更多字段。那么在尝试检索包含给定值的最新文档时,如何返回完整文档?

示例:

{uniqueVal: 1, priority: 1, type: "storage", status:"open", validated: "true", sorting: "desc"}
{uniqueVal: 1, priority: 1, type: "plain", status:"new", validated: "false"}
{uniqueVal: 2, priority: 1, type: "banana", status:"new", randomizedfield: "true"}

应该成为

{uniqueVal: 1, priority: 1, type: "storage", status:"open", validated: "true", sorting: "desc"}
{uniqueVal: 2, priority: 1, type: "banana", status:"new", randomizedfield: "true"}

如何通过唯一字段“uniqueVal”检索文档,而不必硬编码必须返回哪些字段?

(我从Java查询)

2 个答案:

答案 0 :(得分:1)

从概念的角度来看,在我看来,你正在寻找的东西是不实际的:
查找与唯一值匹配的文档假设一个不同的查询,该查询以相应的字段(uniqueVal)为目标。 这很好,数据库可以找到给定字段的唯一值。


当您想要获取与那些“唯一值”相匹配的文档时,问题就出现了:这是将聚合值与各行混合在一起。
为了说明这一点,请查看您自己的示例:您的原始集合包含3个条目,但希望的结果仅包含2.您使用放弃了该文档的基础'类型' ='滑动'吗


这就是为什么唯一值附带AGGREGATED字段的原因,因为否则没有规则包含或排除其他行/文档。

答案 1 :(得分:0)

我在aggregation variable $$ROOT

中找到了答案

运行此命令(Mongo Shell)将返回我想要的过滤结果。返回的格式有点不同,但重要的是它可以正常工作。

db.getCollection('my_collection').aggregate([
    {
        $group:{
            "_id": "$uniqueVal",
            document:{
                $first:"$$ROOT"
            }
        }
    }
])

返回结果

{
    "result" : [ 
        {
            "_id" : 2,
            "document" : {
                "_id" : ObjectId("56b354e6e9d72472495b1de5"),
                "uniqueVal" : 2,
                "priority" : 1,
                "type" : "banana",
                "status" : "new",
                "randomizedfield" : "true"
            }
        }, 
        {
            "_id" : 1,
            "document" : {
                "_id" : ObjectId("56b354e6e9d72472495b1de3"),
                "uniqueVal" : 1,
                "priority" : 1,
                "type" : "storage",
                "status" : "open",
                "validated" : "true",
                "sorting" : "desc"
            }
        }
    ],
    "ok" : 1.0000000000000000
}