我希望形成一个查询,从我的mongo数据库中提取一组结果,但删除/忽略具有重复字段值的结果。
这是senario,我从spotify api中提取了许多结果并将它们存储在我的数据库中,由于我正在做的事情的性质,我最终拉出了许多相同的专辑,这些专辑共享一个id
字段。请注意,这不是mongo _id
字段。
我想要的是,当用户构建可能包含这些副本的查询时,消除同一相册的多个数据。
这是我当前的查询,它可以执行我想要的操作,但不会过滤掉重复项:
Albums.aggregate([
{ $match : { source_region : { $in: countries }}},
{ $skip : offset },
{ $limit : limit }
])
起初我使用的是更典型的Collection.find().sort()
等,并遇到了distinct
,但您无法将sort
,limit
等用于distinct
。
我也试过使用$group
,但这似乎只是返回我指定的字段,所以当我尝试类似的东西时:
{ $group : { _id : null, uniqueValues : { $addToSet : "$id" }}}
返回的唯一字段是id
字段,当我需要与该相册相关的大约10-20时。
如果有人能指出我的方向会很棒!
更新1
以下是集合
中某些文档的示例{
_id : ObjectId("5ad965a8bc349952904f7f31"),
id : 0nEsaNZGpk0HIgY3OGCyR6,
title : "some album",
artist : "some artist
},
{
_id : ObjectId("665fhFHJFjdjfud7d6f6"),
id : 5JUSBHF&55sdfhjkf86sd,
title : "another album",
artist : "another artist
},
{
_id : ObjectId("56&DFHJFHJJFJSgh76sdghhsd"),
id : 0nEsaNZGpk0HIgY3OGCyR6,
title : "some album",
artist : "some artist
}
因此,如果这是我的数据,我只想返回一个共享spotify生成的id
字段的文档。
答案 0 :(得分:1)
由于你已经沉默了,我们只需要做出一些假设。
除了您希望文档中的“one”属性定义“唯一”(除_id
之外的其他属性)之外没有其他数据可用,那么您将要执行的操作是这样的:< / p>
Albumns.aggregate([
{ "$group": {
"_id": "$uniqueProp",
"doc": { "$first": "$$ROOT" }
}},
{ "$replaceRoot": { "newRoot": "$doc" } }
{ "$skip": offset },
{ "$limit": limit }
])
或者你想做的任何其他操作。
使用$group
管道阶段,_id
属性决定了您“分组”的结果的“唯一性”。此键中指定的任何内容产生的值不会超过1。你甚至可以有一个复合值:
{ "$group": {
"_id": { "firstField": "$firstField", "secondField": "$secondField" },
"doc": { "$first": "$$ROOT" }
}}
所以无论出现什么,独特。
每当你“分组”时,你需要一个“累加器”来代替_id
键以外的任何东西。因此,我们使用$first
简单地获取我们指定的任何值的第一个结果,并在此处使用$$ROOT
作为整个文档。
现代版本有$replaceRoot
来清理文档。如果您没有,那么您可以$project
每个字段或只使用"doc"
属性下的输出。