2016-01-11 3 views
2

Я хочу создать чат-систему, а также получить последнее сообщение пользователя, которое может быть обработано. Я также предоставляю запрос с этим, но он возвращает пользователя userId. поэтому, пожалуйста, помогите мне, спасибоMongoDB aggregate Query with select fields

База данных:

/* 1 */ 
{ 
    "_id" : ObjectId("56937df0418a6afab248616d"), 
    "to" : ObjectId("56728051d4b426be03de18f2"), 
    "from" : ObjectId("568e402eaecfa53282f60d17"), 
    "msg" : "Hello!", 
    "cd" : ISODate("2016-01-11T10:03:28.139Z"), 
    "type" : "other", 
    "ir" : 0 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("56937e01418a6afab248616e"), 
    "to" : ObjectId("568e402eaecfa53282f60d17"), 
    "from" : ObjectId("56728051d4b426be03de18f2"), 
    "msg" : "Hi!", 
    "cd" : ISODate("2016-01-11T10:03:45.588Z"), 
    "type" : "other", 
    "ir" : 0 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("56937e45418a6afab248616f"), 
    "to" : ObjectId("56728051d4b426be03de18f2"), 
    "from" : ObjectId("568e402eaecfa53282f60d17"), 
    "msg" : "Shu che ela!", 
    "cd" : ISODate("2016-01-11T10:04:53.280Z"), 
    "type" : "other", 
    "ir" : 0 
} 

Запрос:

db.getCollection('chat_message').aggregate([ 
     { 
      $match: { 
       ir: 0, 
       $or : [ 
        {"to" : ObjectId("56728051d4b426be03de18f2")} 
       ] 
      } 
     }, 

     { $group: { _id: "$from" } }, 

    ]) 

I Выполнить этот запрос, но не получить результат, который я хочу

Требовать Out пришел:

/* 1 */ 
{ 
    "result" : [ 
     { 
      "_id" : ObjectId("568e402eaecfa53282f60d17"), 
      "msg" : "Shu che ela!" 
     } 
    ], 
    "ok" : 1.0000000000000000 
} 

ответ

3

Вы правильный путь, но вы не хватает некоторых вещей о $mongo object Id

В MongoDB, документы, хранящиеся в коллекции требуют уникального _id поле, которое действует в качестве первичного ключа.

так при запуске агрегации запросы $group создает _id для from ключа, но в вашей структуре документа выглядит from имеющие два документа с одинаковыми ObjectId, так как результат возвратом первого критерия соответствия. Это возвращает только "msg" : "Hello!", или "msg" : "Shu che ela!", которые сначала вставляли документы.

поэтому должно измениться ваше состояние таким образом {"$group":{"_id":"$_id","msg":{"$first":"$msg"}}} вы получите оба документа. .

+0

db.getCollection ('chat_message') совокупности ([ { $ матча: { л: 0, $ или: [{ "до": ObjectId ("56728051d4b426be03de18f2")} ] } }, { "$ группа": { "_ идентификатор": "$ от", "сообщение": { "$ последнего": "$ тзда"}}} ]) Я поставил этот вопрос, и я получил последнее сообщение как par i want. спасибо. –