チャクモール:
モンゴへの新規、集約フレームワークを使用して文字列の配列からdupesを除去する例の多くを発見したが、オブジェクト内のフィールドに基づいて、オブジェクトの配列からdupesを除去することが可能であれば疑問に思って。例えば
{
"_id" : ObjectId("5e82661d164941779c2380ca"),
"name" : "something",
"values" : [
{
"id" : 1,
"val" : "x"
},
{
"id" : 1,
"val" : "x"
},
{
"id" : 2,
"val" : "y"
},
{
"id" : 1,
"val" : "xxxxxx"
}
]
}
ここで私は、に基づいてdupesを削除したいid
フィールド。だから、で終わるだろう
{
"_id" : ObjectId("5e82661d164941779c2380ca"),
"name" : "something",
"values" : [
{
"id" : 1,
"val" : "x"
},
{
"id" : 2,
"val" : "y"
}
]
}
与えられたIDの作品で最初/任意のオブジェクトをピッキング。ただ、IDごとに1で終わるしたいです。集約フレームワークでは、このなんとかですか?それともこれを行うにはクリーンな方法を探しても、外部の集約フレームワーク、。私が述べたように集約フレームワークのために良いユースケースのように思われ、コレクション内の多くのドキュメント間での事のこのタイプを行うが、必要性、ここに初心者...ありがとう。
Valijon:
さて、あなたはその結果に2つの方法を希望れるかもしれません。
クラシック
フラット化 - 削除重複(最初の出現を選ぶ) - グループによる
db.collection.aggregate([
{
$unwind: "$values"
},
{
$group: {
_id: "$values.id",
values: {
$first: "$values"
},
id: {
$first: "$_id"
},
name: {
$first: "$name"
}
}
},
{
$group: {
_id: "$id",
name: {
$first: "$name"
},
values: {
$push: "$values"
}
}
}
])
近代的
私たちは、使用する必要が軽減$演算子を。
擬似コード:
values : {
var tmp = [];
for (var value in values) {
if !(value.id in tmp)
tmp.push(value);
}
return tmp;
}
db.collection.aggregate([
{
$addFields: {
values: {
$reduce: {
input: "$values",
initialValue: [],
in: {
$concatArrays: [
"$$value",
{
$cond: [
{
$in: [
"$$this.id",
"$$value.id"
]
},
[],
[
"$$this"
]
]
}
]
}
}
}
}
}
])