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
9
Jagadeesh 24 Апр 2017 в 12:11

2 ответа

Лучший ответ

Вам необходимо поместить этапы конвейера в массив, т.е. документы проходят этапы последовательно.

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]);

Если вы не получили никакого ответа от вышеупомянутого, попробуйте запустить агрегатный конвейер всего одним шагом:

db.audiofiles.aggregate([match]);

Результаты этапа сопоставления будут переданы на следующий этап, поэтому, если вы не получите никаких результатов, это означает, что $match шаг конвейера не нашел подходящих документов. Измените некоторые параметры, чтобы увидеть, есть ли какие-либо результаты.

18
chridam 24 Апр 2017 в 09:43

Я также столкнулся с той же ошибкой. Мой код был:

 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: {} } ])
1
HSP 6 Ноя 2019 в 11:05