{
"_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í)候如上所示,想要獲取用戶ID為5的這個(gè)跟哪些人聊過天,也就是3和4這2個(gè)用戶,現(xiàn)在想要獲取包括content的信息,也就是跟該用戶最新的一條記錄,比如3這個(gè)用戶,我要獲取的就是郭德綱這個(gè)content而不是上面那條,這個(gè)應(yīng)該怎么查詢,初學(xué)mongodb,球幫助
Il s'agit d'un problème de regroupement très typique TOP N
, et il existe des expressions correspondantes dans les bases de données SQL, telles que
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
Ce problème peut être résolu en utilisant aggregation
dans MongoDB. aggregation
est un gros sujet, et je ne peux pas expliquer tout le contenu ici. Vous pouvez uniquement consulter la documentation pour comprendre les différents opérateurs utilisés ci-dessous.
db.chat.aggregate([
{$match: {current_uid: "5"}},
{$sort: {_id: -1}},
{$group: {_id: {current_uid: "$current_uid", to_uid: "$to_uid"}, content: {$first: "$content"}}}
])
Quelques explications?:
L'utilisation de {$sort: {_id: -1}}
est en fait l'ordre chronologique inverse. _id
contient du temps, et la plupart du temps son tri peut être considéré comme du temps de tri
$first
obtient le premier élément. Et si vous souhaitez prendre les n premiers éléments?? $push
+$slice
c'est bien
Comment la requête ci-dessus peut-elle être effectuée plus rapidement?? db.chat.createIndex({current_uid: 1, _id: 1})