web-dev-qa-db-ja.com

集約パイプラインは、「パイプラインステージ仕様オブジェクトには正確に1つのフィールドが含まれている必要があります」というエラーをスローします。

db.audiofiles.aggregate({
    $match: {
        privacy: { $ne: "same" },
        date: { "$eq": "2017/04/25" },
        deleted: 0
    },
    $group: { "_id": "$to_email" }
});

利用した $matchしかし、それでも以下のようにパイプラインエラーが表示されています。

assert: command failed: {
    "ok" : 0,
    "errmsg" : "A pipeline stage specification object must contain exactly one field.",
    "code" : 16435
} : aggregate failed
7
Jagadeesh

パイプラインステージを array に配置する必要があります。つまり、ドキュメントはステージを順番に通過します。

_db.collection.aggregate( [ { <stage> }, ... ] )
_

_$group_パイプラインステップ演算子は、_$match_パイプラインステップ。パイプラインを集約する必要があります

_db.audiofiles.aggregate([
    /* match pipeline */
    {
        "$match": {
            "privacy": { "$ne": "same" },
            "date": { "$eq": "2017/04/25" },
            "deleted": 0
        }
    },
    /* group pipeline */
    {
        "$group": { 
            "_id": "$to_email", 
            "count": { "$sum": 1 }
        }
    }
]);
_

または、配列にプッシュできるオブジェクト変数としてパイプラインステップを作成すると、その配列がパイプラインになり、aggregate()メソッド引数:

_/* match pipeline */
var match = {
    $match: {
        privacy: { $ne: "same" },
        date: { "$eq": "2017/04/25" },
        deleted: 0
    }
},
/* group pipeline */
group = {
    $group: { 
        "_id": "$to_email", 
        "count": { "$sum": 1 }
    }
};

db.audiofiles.aggregate([match, group]);
_

上記の応答がない場合は、1つの手順で集約パイプラインを実行してみてください。

_db.audiofiles.aggregate([match]);
_

一致ステップの結果は次のステージにパイプ処理されるため、結果が得られない場合は、_$match_パイプラインステップで一致するドキュメントが見つかりませんでした。一部のパラメーターを変更して、結果があるかどうかを確認します。

16
chridam

私も同じエラーに直面していました。私のコードは:

 db.getCollection('users').aggregate([
      {
          "$lookup":
          {     
              from: 'songs',
              localField: '_id',
              foreignField: 'artistId',              
              as: 'abc'              
          },
          "$project":
          {
              "name":1,
              "status":1,
              "abc":{"artistId":1, "name":1}
          }
      }
])

{}を追加して解決しました。

db.getCollection('users').aggregate([
      {
          "$lookup":
          {     
              from: 'songs',
              localField: '_id',
              foreignField: 'artistId',              
              as: 'abc'              
          }
      }, // added braces
      { 
          "$project":
          {
              "name":1,
              "status":1,
              "abc":{"artistId":1, "name":1}
          }
      } // added braces
])

注:: $ lookupと$ projectが次のような異なる{}中括弧で囲まれていることを確認してください。

db.getCollection('users').aggregate([ { $lookup:{} }, { $project: {} } ])

私のコードは:

 db.getCollection('users').aggregate([ { $lookup:{},  $project: {} } ])
0
HSP