我有一个名为的大型收藏Messages
,如下所示:
{
user: 94fg844f,
event: null,
group: null,
name: "Jake",
text: "Hello world"
}, {
user: fje93jrg4,
event: null,
group: null,
name: "Bob"
text: "Testing"
}, {
user: fje93jrg4,
event: null,
group: null,
name: "Bob"
text: "Text here"
}, {
user: null,
event: d0j3n9fn3,
group: null,
name: "My Event"
text: "Testing 2"
}, {
user: null,
event: d0j3n9fn3,
group: null,
name: "My Event"
text: "Another text"
}
我需要首先出现用户,事件和组。
例如,由于用户fje93jrg4
发生两次,我只是想用文本文件回Testing
,因为一个与文字Text here
是比它年长。的event
也是如此d0j3n9fn3
。尽管我只想用的文本取回它的第一个文档,但它发生了两次Testing 2
。
我看着distinct
虽然它似乎只支持一个搜索词,像user
代替的user
,event
和group
。
以上的最终结果将是:
{
user: 94fg844f,
event: null,
group: null,
name: "Jake",
text: "Hello world"
}, {
user: fje93jrg4,
event: null,
group: null,
name: "Bob"
text: "Testing"
}, , {
user: null,
event: d0j3n9fn3,
group: null,
name: "My Event"
text: "Testing 2"
}
我的猜测是,我可能不得不在这些行中使用aggregate
with$first
或之类的东西。进行3个不同查询的问题是我需要应用一个限制,以便总能获得10个结果。例如,group
混合中可能没有最近的s,而只有event
s和user
s。
我们可以使用聚合框架来做到这一点。首先,我们需要$sort
byuser
和“ _id”。然后$group
,从那里开始,由“用户”使用$last
累加器运算符返回每个用户的最后一个文档。请注意,$first
如果我们以降序对文档进行排序,但是以升序进行排序并使用$last
我们的意图,则也可以使用累加器运算符。
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
产生:
{
"_id" : "fje93jrg4",
"user" : {
"_id" : 2,
"user" : "fje93jrg4",
"event" : null,
"group" : null,
"name" : "Bob",
"text" : "Testing"
}
}
{
"_id" : "94fg844f",
"user" : {
"_id" : 1,
"user" : "94fg844f",
"event" : null,
"group" : null,
"name" : "Jake",
"text" : "Hello world"
}
}
{
"_id" : null,
"user" : {
"_id" : 4,
"user" : null,
"event" : "d0j3n9fn3",
"group" : null,
"name" : "My Event",
"text" : "Testing 2"
}
}
我们可能想在$project
管道中添加一个,但是这样做会导致性能下降。但是,如果不需要返回的文档中的所有键/值对,它将减少通过网络发送的数据量以及用于解码客户端文档的时间和内存。
该$project
阶段是这样的:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句