{
"_id" : ObjectId("576cfd363325ffaa1dbdde15"),
"current_uid" : "5",
"to_uid" : "3",
"content" : "你大爺"
},
{
"_id" : ObjectId("576cfd6e3325ff501e07f4ae"),
"current_uid" : "5",
"to_uid" : "3",
"content" : "郭德綱"
},
{
"_id" : ObjectId("576cfe753325ff501ea76603"),
"current_uid" : "5",
"to_uid" : "4",
"content" : "325235"
}
存的時(shí)候如上所示,想要獲取用戶(hù)ID為5的這個(gè)跟哪些人聊過(guò)天,也就是3和4這2個(gè)用戶(hù),現(xiàn)在想要獲取包括content的信息,也就是跟該用戶(hù)最新的一條記錄,比如3這個(gè)用戶(hù),我要獲取的就是郭德綱這個(gè)content而不是上面那條,這個(gè)應(yīng)該怎么查詢(xún),初學(xué)mongodb,球幫助
これは非常に典型的なグループ化 TOP N
問(wèn)題です。SQLServer などの SQL データベースにも対応する式があります。
リーリー
TOP N
問(wèn)題,放到SQL數(shù)據(jù)庫(kù)里面也有相應(yīng)的表達(dá)方式,比如SQLServer的
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
MongoDB里面用aggregation
就可以解決了。aggregation
是個(gè)很大的話(huà)題,這里沒(méi)法講解全部?jī)?nèi)容,下面用到的各種操作符只能自己去查下文檔理解。
db.chat.aggregate([
{$match: {current_uid: "5"}},
{$sort: {_id: -1}},
{$group: {_id: {current_uid: "$current_uid", to_uid: "$to_uid"}, content: {$first: "$content"}}}
])
幾點(diǎn)解釋?zhuān)?/p>
使用{$sort: {_id: -1}}
其實(shí)就是時(shí)間倒序。_id
里面包含了時(shí)間,對(duì)它的排序大部分時(shí)候可以認(rèn)為是對(duì)時(shí)間的排序;
$first
取到了第一個(gè)元素。如果想取頭n個(gè)元素怎么辦?$push
+$slice
就可以了;
以上查詢(xún)?cè)趺茨芨欤?code>db.chat.createIndex({current_uid: 1, _id: 1})これは、MongoDB の aggregation
を使用することで解決できます。 aggregation
は大きなトピックです。ここですべての內(nèi)容を説明することは不可能です。以下で使用されるさまざまな演算子を理解するには、ドキュメントを確認(rèn)するしかありません。
{$sort: {_id: -1}}
を使用すると、実際には逆時(shí)系列になります。 _id
には時(shí)間が含まれており、ほとんどの場(chǎng)合、それを並べ替えることは並べ替え時(shí)間と見(jiàn)なされます ????。
$first
は最初の要素を取得します。最初の n 要素を取得したい場(chǎng)合はどうすればよいでしょうか? $push
+$slice
で十分です ????
db.chat.createIndex({current_uid: 1, _id: 1})
????
??