我有一个名为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
的{{1}}相同。它发生了两次,虽然我只想用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
或类似的东西。做3个不同查询的问题是我需要应用一个限制,这样我总能得到10个结果。例如,混合中可能没有$first
,只有group
和event
s。
答案 0 :(得分:1)
我们可以使用聚合框架来完成此任务。首先,我们需要user
$last
和" _id"。然后,我们通过"用户"然后$sort
并使用$group
累加器运算符返回每个用户的最后一个文档。请注意,如果我们按降序对文档进行排序,我们也可以使用$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
我们可能希望在管道中添加$first
,但这样做会导致性能下降。但是,如果不需要返回文档中的所有键/值对,它将减少通过线路发送的数据量以及用于解码客户端文档的时间和内存。
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}
阶段如下所示:
tester
答案 1 :(得分:-1)
作品完美:
db.getCollection('Mytest')。aggregate([{$ match:{user:“fje93jrg4”}},{$ limit:1}])