2016-07-09 3 views
0

В моей базе данных mongodb у меня есть коллекция сообщений, которые я использую для отправки личных сообщений от пользователя к пользователю. Я хочу получить разговоры пользователя. У меня есть эта модель данных:Mongodb извлекает разговор из сообщений

ОБНОВЛЕНО

JSON
{ 
    "_id" : ObjectId("577f81fde4501ba208b0e470"), 
    "text" : "This is a message", 
    "sender_profile_id" : ObjectId("577e69b0794f49d962f10e85"), 
    "receiver_profile_id" : ObjectId("577e57393db745060b532000"), 
},  
{ 
    "_id" : ObjectId("577f81fde4501ba208b0e470"), 
    "text" : "This is a message", 
    "sender_profile_id" : ObjectId("577e57393db745060b532000"), 
    "receiver_profile_id" : ObjectId("577e69b0794f49d962f10e85"), 
},  
{ 
    "_id" : ObjectId("577f81fde4501ba208b0e470"), 
    "text" : "This is a message", 
    "sender_profile_id" : ObjectId("577e57393db745060b532000"), 
    "receiver_profile_id" : ObjectId("577e69b0794f49d962f10e82"), 
}, 
{ 
    "_id" : ObjectId("577f81fde4501ba208b0e470"), 
    "text" : "This is a message", 
    "sender_profile_id" : ObjectId("577e69b0794f49d962f10e82"), 
    "receiver_profile_id" : ObjectId("577e57393db745060b532000"), 
},  

С помощью этой теории JSON У меня есть 2 разговор для пользователя ObjectId ("577e57393db745060b532000"). Как я могу их получить?

Обновлено решение

Я решил с этим:

var selector = {}; 
selector['$or'] = [ 
    {"sender_profile_id" : ObjectId(decoded.profile._id)}, 
    {"receiver_profile_id" : ObjectId(decoded.profile._id)} 
]; 

selector['_acl'] = {$exists : true}; 
selector['_acl.' + decoded.profile._id] = {$exists : true}; 
selector['_acl.' + decoded.profile._id + '.read'] = true; 

var query = { 
    $match : selector 
}; 

var group = { 
    $group: { 
    _id: "$_id", 
    text : { $last: '$text' }, 
    sender_profile_id : { $last: '$sender_profile_id' }, 
    receiver_profile_id : { $last: '$receiver_profile_id' }, 
    receiver : {$addToSet : '$receiver_profile_id'}, 
    sender: {$addToSet : '$sender_profile_id'}, 
    created_at : { $last: '$created_at' }, 
    updated_at : { $last: '$updated_at' }, 
    count: { $sum: 1 } 
    } 
}; 

var project = { 
    $project: { 
    _id: "$_id", 
    text: "$text", 
    sender_profile_id: '$sender_profile_id', 
    receiver_profile_id: '$receiver_profile_id', 
    created_at : '$created_at', 
    updated_at : '$updated_at', 
    participants : { 
     $cond: { 
     if: { 
      $gte: ["$sender", "$receiver"] }, 
      then: { "$setUnion": ["$receiver", "$sender"] }, 
      else: { "$setUnion": ["$sender", "$receiver"] } 
     } 
     } 
    } 
    }; 

    var group2 = { 
    $group: { 
     _id: "$participants", 
     text : { $first: '$text' }, 
     sender_profile_id : { $first: '$sender_profile_id' }, 
     receiver_profile_id : { $first: '$receiver_profile_id' }, 
     created_at : { $first: '$created_at' }, 
     updated_at : { $first: '$updated_at' }, 
     count: { $sum: 1 } 
    } 
    }; 

var project2 = { 
    $project: { 
    _id : 0, 
    participants : "$_id", 
    text: "$text", 
    interlocutor_profile_id: { 
     $cond: { 
     if: {"$eq": [ "$receiver_profile_id", ObjectId(decoded.profile._id)]}, 
     then: '$sender_profile_id', 
     else: '$receiver_profile_id' 
    } 
    }, 
    created_at : 1, 
    updated_at : 1, 
    count: 1 
    } 
} 

var sort = { 
    $sort: { 
     "created_at": -1 
    } 
} 

var sort2 = { 
    $sort: { 
     "created_at": -1 
    } 
} 

db.collection('message').aggregate(query, group, project, sort, group2, project2, sort2, function(error, result) 
+0

Попробуйте это:. Дб .find ({$ или: [{ 'sender._id': «ObjectId ("577e57393db745060b532000") '}, {' receiver._id ':' ObjectId ("577e57393db745060b532000") '}]}). Pretty(); – Jain

+0

дайте мне знать, если проблема существует, или я что-то пропустил – Jain

+0

Это может дать вам идею. https://stackoverflow.com/questions/35549200/mongo-group-and-sum-with-two-fields – styvane

ответ

0

попробовать это:

db.aggregate([ {$match: {$or: [{'sender._id': 'ObjectId("577e57393db745060b532000")','receiver._id': 'ObjectId("577e69b0794f49d962f10e85")'},{'sender._id': 'ObjectId("577e69b0794f49d962f10e85")','receiver._id': 'ObjectId("577e57393db745060b532000")'}]}}, {$group: { _id: '$sender._id', vals: { '$push': '$receiver._id' } }} ]) 
+0

Я попробовал это, но я изменил часть и упростил json, используя только objectid как значение отправителя и получателя и в $ или: [{"sender": ObjectId ('577e57393db745060b532000')}, {"receiver": ObjectId (' 577e57393db745060b532000 ')}] ', потому что я хочу знать разговор от пользователя (зарегистрированного пользователя). Than with '$ group: { _id: '$ sender', vals: {'$ push': '$ receiver'} }' Я получаю только 1 результат, но это должно быть 2 ... – Harald

-1

Попробуйте следующее

db.messages.aggregate([{$project: {correspondents: {$cond: { if: {$gte: ["$sender", "$receiver"]}, then: ["$sender", "$receiver"], else: ["$receiver", "$sender"]}}}}, {$group: {_id: "$correspondents", messages: {$addToSet: "$_id"}}}, {$match: {"_id": ObjectId("577e57393db745060b532000")}}])

Группы запросов по парам участников беседы (корреспонденты) и возвращает массив сообщений, составляющих беседу. Кроме того, вы можете получить разговор, принадлежащий определенному пользователю.

+0

Я попробовал , но он возвращает пустой массив. Как будто они не разговоры. – Harald

+0

Странно, потому что я запустил его на части данных, которые вы разместили в вопросе, и получил ровно две беседы. Вы запустили его в консоли? –

+0

Нет, я использую его с nodejs и работает с обратными вызовами – Harald

0

нашел решение для моего вопроса:

var selector = {}; 
selector['$or'] = [ 
{"sender_profile_id" : ObjectId(decoded.profile._id)}, 
{"receiver_profile_id" : ObjectId(decoded.profile._id)} 
]; 

selector['_acl'] = {$exists : true}; 
selector['_acl.' + decoded.profile._id] = {$exists : true}; 
selector['_acl.' + decoded.profile._id + '.read'] = true; 

var query = { 
$match : selector 
}; 

var group = { 
$group: { 
    _id: "$_id", 
    text : { $last: '$text' }, 
    sender_profile_id : { $last: '$sender_profile_id' }, 
    receiver_profile_id : { $last: '$receiver_profile_id' }, 
    receiver : {$addToSet : '$receiver_profile_id'}, 
    sender: {$addToSet : '$sender_profile_id'}, 
    created_at : { $last: '$created_at' }, 
    updated_at : { $last: '$updated_at' }, 
    count: { $sum: 1 } 
} 
}; 

var project = { 
    $project: { 
    _id: "$_id", 
    text: "$text", 
    sender_profile_id: '$sender_profile_id', 
    receiver_profile_id: '$receiver_profile_id', 
    created_at : '$created_at', 
    updated_at : '$updated_at', 
    participants : { 
    $cond: { 
     if: { 
     $gte: ["$sender", "$receiver"] }, 
     then: { "$setUnion": ["$receiver", "$sender"] }, 
     else: { "$setUnion": ["$sender", "$receiver"] } 
     } 
    } 
    } 
}; 

var group2 = { 
$group: { 
    _id: "$participants", 
    text : { $first: '$text' }, 
    sender_profile_id : { $first: '$sender_profile_id' }, 
    receiver_profile_id : { $first: '$receiver_profile_id' }, 
    created_at : { $first: '$created_at' }, 
    updated_at : { $first: '$updated_at' }, 
    count: { $sum: 1 } 
} 
}; 

var project2 = { 
$project: { 
    _id : 0, 
    participants : "$_id", 
    text: "$text", 
    interlocutor_profile_id: { 
    $cond: { 
    if: {"$eq": [ "$receiver_profile_id", ObjectId(decoded.profile._id)]}, 
    then: '$sender_profile_id', 
    else: '$receiver_profile_id' 
    } 
}, 
created_at : 1, 
updated_at : 1, 
count: 1 
} 
} 

var sort = { 
$sort: { 
    "created_at": -1 
} 
} 

var sort2 = { 
    $sort: { 
    "created_at": -1 
    } 
} 

db.collection('message').aggregate(query, group, project, sort, group2, project2, sort2, function(error, result) 
Смежные вопросы