MongoDBで集約メソッドを使用してグループ化していますが、$group
を使用すると、グループ化に使用した唯一のフィールドが返されます。私は$project
を試しましたが、うまくいきません。私も$first
を試してみましたが、うまくいきましたが、結果データは異なる形式になりました。
私が必要とする応答フォーマットは次のようになります:
{
"_id" : ObjectId("5b814b2852d47e00514d6a09"),
"tags" : [],
"name" : "name here",
"rating" : "123456789"
}
そして、私のquery.responseに$ groupを追加すると、_idの値が変化します。 (そして、$ groupは_idのみを取ります。他のキーワードを試すと、アキュムレータのエラーをスローします。これについても説明してください。)
{
"_id" :"name here" //the value of _id changed to the name field which i used in $group condition
}
構造とフィールドを変更せずに、名前フィールドの重複を削除する必要があります。また、mongooseでnodeJSを使用しているので、それと連携するソリューションを提供してください。
以下の集計クエリを使用できます。
$$ROOT
各名前ごとにドキュメント全体を保持し、その後に$replaceRoot
を使用して、ドキュメントをトップに昇格させます。
db.col.aggregate([
{"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
{"$replaceRoot":{"newRoot":"$doc"}}
])
任意のデータベースでデータをグループ化する場合、それは必要なフィールドで累積演算を実行することを意味し、累積演算に含まれない他のフィールドはグループのように使用されます
db.collection.aggregate([{
$group: {
_id: { field1: "", field1: "" },
acc: { $sum: 1 }
}}]
ここの_idオブジェクトには、保持したい他のすべてのフィールドが含まれます。
あなたのデータについては、これを試すことができます
db.collection.aggregate([{
$group: {
_id: "$name",
rating: { $first: "$rating" },
tags: { $first: "$tag" },
docid: { $first: "$_id" }
}
},
{
$project: {
_id: "$docid",
name: "$_id",
rating: 1,
tags: 1
}
}])
user2683814の解決策は私にとってはうまくいきましたが、私の場合、newRootオブジェクトを置き換えるときにカウンターアキュムレータがあり、カウントフィールドが最後のステージにないため、$mergeObjects
演算子を使用して、カウントフィールドを取得します。
db.collection.aggregate([
{
$group: {
_id: '$product',
detail: { $first: '$$ROOT' },
count: {
$sum: 1,
},
},
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [{ count: '$count' }, '$product'] },
},
}])
このクエリを使用できます
db.col.aggregate([
{"$group" : {"_id" : "$name","data" : {"$first" : "$$ROOT"}}},
{"$project" : {
"tags" : "$data.tags",
"name" : "$data.name",
"rating" : "$data.rating",
"_id" : "$data._id"
}
}])