2016-09-13 4 views
1

Как передать параметр агрегированию? Я получаю Params и пытаюсь передать его с помощью $match оператора, но запрос возвращает пустой массив:NodeJS MongoDB Параметр пропуска в конвейере агрегации

app.get('/api/:name', function(req, res){ 
     var name = req.params.name; 
     console.log(name); 

     db.collection('coll').aggregate([{$match: {name: '$name'}}, {$unwind: { path: "$dates", includeArrayIndex: "idx" } }, { $project: { _id: 0, dates: 1, numbers: { $arrayElemAt: ["$numbers", "$idx"] }, goals: { $arrayElemAt: ["$goals", "$idx"] }, durations: { $arrayElemAt: ["$durations", "$idx"]}}}]).toArray(function(err, docs) { 
      if (err) { 
       assert.equal(null); 
      } 
      else { 
       console.log(docs); 
       res.json(docs); 
      } 
     }); 
    }) 

Я должен заботиться о порядке операторов в трубопроводе?

+2

Try '{$ спичкой: {Имя:}}'. переменная 'name' находится в области, поэтому мы просто используем javascript для ссылки на запрос в запросе. – homam

ответ

1

Попробуйте следующий код: -

app.get('/api/:name', function(req, res){ 
    var name = req.params.name; 

    var query = [{$match: {'name': name}}, {$unwind: { path: "$dates", includeArrayIndex: "idx" } }, { $project: { _id: 0, dates: 1, numbers: { $arrayElemAt: ["$numbers", "$idx"] }, goals: { $arrayElemAt: ["$goals", "$idx"] }, durations: { $arrayElemAt: ["$durations", "$idx"]}}}]; 

    db.collection('coll').aggregate(query).toArray(function(err, docs) { 
     if (err) { 
      assert.equal(null); 
     } 
     else { 
      console.log(docs); 
      res.json(docs); 
     } 
    }); 
}) 
1

Кажется, вы никогда не используете переменную, называемую именем.

Попробуйте это, измените {$match: {name: '$name'} на {$match: {name: name}.

Смежные вопросы