web-dev-qa-db-ja.com

mongoDBでグループ化し、すべてのフィールドを結果に返す方法

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を使用しているので、それと連携するソリューションを提供してください。

9
Anukool

以下の集計クエリを使用できます。

$$ROOT各名前ごとにドキュメント全体を保持し、その後に$replaceRootを使用して、ドキュメントをトップに昇格させます。

db.col.aggregate([
  {"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
  {"$replaceRoot":{"newRoot":"$doc"}}
])
23
Sagar Veeram

任意のデータベースでデータをグループ化する場合、それは必要なフィールドで累積演算を実行することを意味し、累積演算に含まれない他のフィールドはグループのように使用されます

 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
    }
}])
3

user2683814の解決策は私にとってはうまくいきましたが、私の場合、newRootオブジェクトを置き換えるときにカウンターアキュムレータがあり、カウントフィールドが最後のステージにないため、$mergeObjects演算子を使用して、カウントフィールドを取得します。

db.collection.aggregate([
 {
  $group: {
    _id: '$product',
    detail: { $first: '$$ROOT' },
    count: {
      $sum: 1,
    },
  },
},
{
  $replaceRoot: {
    newRoot: { $mergeObjects: [{ count: '$count' }, '$product'] },
  },
}])
1
Sathish Kumar

このクエリを使用できます

db.col.aggregate([
                        {"$group" : {"_id" : "$name","data" : {"$first" : "$$ROOT"}}},
                        {"$project" : {
                            "tags" : "$data.tags",
                            "name" : "$data.name",
                            "rating" : "$data.rating",
                            "_id" : "$data._id"
                            }
                        }])
0
Senthur Deva