我见过非常相似的问题和这个问题的解决方案,但我不确定如何将它合并到我自己的查询中。我正在用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