Scala / MongoDB - 删除重复项



我见过非常相似的问题和这个问题的解决方案,但我不确定如何将它合并到我自己的查询中。我正在用Scala编程并使用MongoDB聚合"框架"。

val getItems = Seq (
    Aggregates.lookup(Store...)...
    Aggregates.lookup(Store.STORE_NAME, "relationship.itemID", "uniqueID", "item"), 
    Aggregates.unwind("$item"), 
    // filter duplicates here ?
    Aggregates.lookup(Store.STORE_NAME, "item.content", "ID", "content"), 
    Aggregates.unwind("$content"), 
    Aggregates.project(Projections.fields(Projections.include("store", "item", "content")))
)

查询返回不需要的重复对象。我想删除这些。我怎样才能合并Aggregates.group和"$addToSet"来做到这一点?或任何其他合理的解决方案也很棒。

注意:我必须省略有关查询的一些详细信息,因此不存在存储查找聚合。但是,我想稍后在查询中删除重复项,因此希望它无关紧要。

如果我需要提供更多信息,请告诉我。

谢谢。

编辑: 31/07/2019:13:47

我尝试了以下方法:

val getItems = Seq (
    Aggregates.lookup(Store...)...
    Aggregates.lookup(Store.STORE_NAME, "relationship.itemID", "uniqueID", "item"),
    Aggregates.unwind("$item"), 
    Aggregates.group("$item.itemID, 
      Accumulators.first("ID", "$ID"),
      Accumulators.first("itemName", "$itemName"),
      Accumulators.addToSet("item", "$item") 
    Aggregates.unwind("$items"), 
    Aggregates.lookup(Store.STORE_NAME, "item.content", "ID", "content"), 
    Aggregates.unwind("$content"), 
    Aggregates.project(Projections.fields(Projections.include("store", "items", "content")))
)

但是我的查询现在返回零结果而不是重复结果。

您可以使用$first删除重复项。假设我有以下数据:

[
  {"_id": 1,"item": "ABC","sizes": ["S","M","L"]},
  {"_id": 2,"item": "EFG","sizes": []},
  {"_id": 3, "item": "IJK","sizes": "M" },
  {"_id": 4,"item": "LMN"},
  {"_id": 5,"item": "XYZ","sizes": null
  }
]

现在,让我们使用 $first$unwind 聚合它,看看区别:

首先,让我们使用 $first 聚合它

db.collection.aggregate([
  { $sort: {
      item: 1
    }
  },
  { $group: {
      _id: "$item",firstSize: {$first: "$sizes"}}}
])

输出

[
  {"_id": "XYZ","firstSize": null},
  {"_id": "ABC","firstSize": ["S","M","L" ]},
  {"_id": "IJK","firstSize": "M"},
  {"_id": "EFG","firstSize": []},
  {"_id": "LMN","firstSize": null}
]

现在,让我们使用 $unwind 聚合它

db.collection.aggregate([
  {
    $unwind: "$sizes"
  }
])

输出

[
  {"_id": 1,"item": "ABC","sizes": "S"},
  {"_id": 1,"item": "ABC","sizes": "M"},
  {"_id": 1,"item": "ABC","sizes": "L},
  {"_id": 3,"item": "IJK","sizes": "M"}
]

您可以看到$first删除了重复项,而$unwind保留了重复项。

同时使用$unwind和$first。

db.collection.aggregate([
  { $unwind: "$sizes"},
  {
    $group: {
      _id: "$item",firstSize: {$first: "$sizes"}}
  }
])

输出

[
  {"_id": "IJK", "firstSize": "M"},
  {"_id": "ABC","firstSize": "S"}
]

group那么addToSet是处理问题的有效方法!
在蒙古壳中看起来像这样

db.sales.aggregate(
    [
      {
        $group:
      {
        _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } },
        itemsSold: { $addToSet: "$item" }
      }
      }
    ]
  )

在 Scala 中,你可以像这样做

 Aggregates.group("$groupfield", Accumulators.addToSet("fieldName","$expression"))

如果要分组多个字段

 Aggregates.group(new BasicDBObject().append("fieldAname","$fieldA").append("fieldBname","$fieldB")), Accumulators.addToSet("fieldName","expression"))

然后unwind

最新更新