2013-04-16 1 views
0

Сценарий: Рассмотрим документ, присутствующий в MongoDB в коллекции под названием «MyCollection»

 { 
     "_id" : ObjectId("512bc95fe835e68f199c8686"), 
     "author": "dave", 
     "score" : 80, 
     "USER" : { 
        "UserID": "Test1", 
        "UserName": "ABCD" 
        } 
     }, 
     { "_id" : ObjectId("512bc962e835e68f199c8687"), 
     "author" : "dave", 
     "score" : 85, 
     "USER" : { 
        "UserID": "Test2", 
        "UserName": "XYZ" 
        } 
     }, 
     ... 

Я знаю UserID и хотите получать на его основе.

Issue: Я попытался следующий код с Node.js + MongoDB-родной драйвер:

db.Collection('MyCollection', function (err, collection) { 
     if (err) return console.error(err); 
     collection.aggregate([ 
         { $match: { '$USER.UserID': 'Test2'} }, 
         {$group: { 
          _id: '$_id' 
         } 
        }, 
         { 
          $project: { 
           _id: 1 
          } 
         } 
         ], function (err, doc) { 
          if (err) return console.error(err); 
          console.dir(doc); 
         }); 
      }); 

но не работает, как ожидалось.

Вопрос: Может ли кто-нибудь знать, как сделать то же самое с оператором $match в запросе MongoDB?


Обновление: У меня нет ошибок. Но объект будет погашен, т.е. []

+0

Вывести доллар в 'USER.UserID', оператор' $ match' работает точно так же, как обычный запрос – Sammaye

+0

Даже после удаления '$' out я все еще получаю '[]' –

+0

Какая версия У MongoDB есть ли у вас? У меня работает 2.4, и это сработало для меня. – gustavohenke

ответ

1

Я пытался в оболочке и ваше $match утверждение неверно - пытается в оболочке

> db.MyCollection.find() 
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "USER" : { "UserID" : "Test1", "UserName" : "ABCD" } } 
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "USER" : { "UserID" : "Test2", "UserName" : "XYZ" } } 
> db.MyCollection.aggregate([{$match: {"$USER.UserID": "Test2"}}]) 
{ "result" : [ ], "ok" : 1 } 
> db.MyCollection.aggregate([{$match: {"USER.UserID": "Test2"}}]) 
{ 
    "result" : [ 
     { 
      "_id" : ObjectId("512bc962e835e68f199c8687"), 
      "author" : "dave", 
      "score" : 85, 
      "USER" : { 
       "UserID" : "Test2", 
       "UserName" : "XYZ" 
      } 
     } 
    ], 
    "ok" : 1 
} 

Таким образом, полная агрегация будет:

db.MyCollection.aggregate([ 
    {$match: {"USER.UserID": "Test2"}}, 
    {$group: {"_id": "$_id"}}, 
    {$project: {"_id": 1}} 
]) 

(Вам не нужны дополнительные $project, поскольку вы только проект _id в $group, но в равной степени, как и _id, вы должны просто иметь $project и r emove the $group)