关于这个问题有很多问题,但是没有一个问题能回答我的问题,所以这里有:
如何查找具有唯一值的文档,然后返回完整的文档?
我看过例如所有类似问题的this question和the 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查询)
答案 0 :(得分:1)
从概念的角度来看,在我看来,你正在寻找的东西是不实际的:
查找与唯一值匹配的文档假设一个不同的查询,该查询以相应的字段(uniqueVal)为目标。
这很好,数据库可以找到给定字段的唯一值。
当您想要获取与那些“唯一值”相匹配的文档时,问题就出现了:这是将聚合值与各行混合在一起。
为了说明这一点,请查看您自己的示例:您的原始集合包含3个条目,但希望的结果仅包含2.您使用放弃了该文档的基础'类型' ='滑动'吗
这就是为什么唯一值附带AGGREGATED字段的原因,因为否则没有规则包含或排除其他行/文档。
答案 1 :(得分:0)
运行此命令(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
}