猫鼬独特的结果

时间:2018-04-20 05:49:26

标签: javascript node.js mongodb mongoose aggregation-framework

我希望形成一个查询,从我的mongo数据库中提取一组结果,但删除/忽略具有重复字段值的结果。

这是senario,我从spotify api中提取了许多结果并将它们存储在我的数据库中,由于我正在做的事情的性质,我最终拉出了许多相同的专辑,这些专辑共享一个id字段。请注意,这不是mongo _id字段。

我想要的是,当用户构建可能包含这些副本的查询时,消除同一相册的多个数据。

这是我当前的查询,它可以执行我想要的操作,但不会过滤掉重复项:

Albums.aggregate([
    { $match : { source_region : { $in: countries }}},
    { $skip  : offset },
    { $limit : limit }
])

起初我使用的是更典型的Collection.find().sort()等,并遇到了distinct,但您无法将sortlimit等用于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字段的文档。

1 个答案:

答案 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"属性下的输出。

相关问题