私はMongo 3.2のデータベースを会話の集まりに持っています。各要素は、以下のようになります。MongoDBは最初の項目を返すだけです
{
"_id" : ObjectId("582e9f85160238a44ef0bfbd"),
"conversation_id" : 39,
"owner_id" : 8,
"title" : "Title",
"recipients" : 1,
"last_modified" : "2016-10-28 06:21:35",
"locked" : 0,
"recipients_details" : [
{
"user_id" : 1,
"last_message" : "2016-10-28 06:21:35"
},
{
"user_id" : 8,
"last_message" : "2016-10-28 06:14:00"
}
]
}
私はいくつかののuser_idが含まれている会話に最後のメッセージを投稿されたすべてのユーザーを取得したいです。例として、ユーザー#8のすべての会話を取得したい場合、上記のJSONの 'recipients_details'は、メッセージが最後であるためuser_id = 1のレコードを1つだけ含める必要があります。私はこのコードを試してみたが、それはすべてのレコードを与え、それを巻き戻すこと(この文で)ソリューションではありません。
db.conversations.aggregate([
{$match:{'recipients_details.user_id':1}},
{$sort:{'last_modified':-1}},
{$project:{_id:1,last_modified:1,recipients_details:1}}
])
UPD:構造は2つのMySQLのテーブル(会話と受信者(conversation_id
から移行されました、 user_id
,message_posted
))。私は、このSQLのアナログを見つけたい:
SELECT * FROM `recipients` WHERE `conversation_id` IN (SELECT `conversation_id` FROM `recipients` WHERE `user_id` = 1) AND `user_id` <> 1 GROUP BY `conversation_id` ORDER BY `message_posted` DESC
、結果として私が持っている:
conversation_id user_id message_posted
--------------- ------- ---------------------
40 164 2016-11-01 12:13:23
39 8 2016-10-28 06:14:00
27 65 2016-10-26 14:26:59
23 65 2016-10-26 14:23:59
24 62 2016-10-26 08:44:14
20 62 (NULL)
25 76 (NULL)
42 64 (NULL)
43 65 (NULL)
44 68 (NULL)
IIUC last is max 'last_message' right? – styvane
これを正しく取得した場合、特定の 'user_id'に属している(last_messageでソートされた)会話の最後のメッセージを投稿するユーザーのセットを探したいですか?この場合、 '{'recipients_details.user_id':1}' – hyades
にマッチングしているのはそれだけです。ここに私が持っているものと、私が見ているものの[貼り付け](http://pastebin.com/F6ZCErAU)があります。会話に投稿した最後のユーザーを見つけたいだけですが、すべてのユーザーではなく、現在のユーザーのみを探しています。 – Iworb