Node.js 如何仅返回第一次出现的带有Mongoose的ID?

Node.js 如何仅返回第一次出现的带有Mongoose的ID?,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有一个名为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,

我有一个名为
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"
}
我需要获得用户、事件和组的首次出现

例如,由于user
fje93jrg4
出现两次,我只想用
Testing
文本取回文档,因为这里
文本的文档比它旧。
d0j3n9fn3
事件也同样如此。它出现了两次,尽管我只想用
Testing 2
的文本取回它的第一个文档

我查看了
distinct
,尽管它似乎只支持一个搜索词,比如
user
而不是
user
事件

上述工作的最终结果将是:

{
   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"
}
我的猜测是,我可能必须使用
聚合
$first
或者类似的东西。做3个不同查询的问题是,我需要应用一个限制,这样我总能得到10个结果。例如,组合中可能没有最近的
s,只有
事件
s和
用户
s。

工作完美:


聚合([{$match:{user:{fje93jrg4},{$limit:1}])

我们可以使用聚合框架来实现这一点。首先,我们需要通过
用户
和“\u id”。从那里,我们通过“user”并使用累加器操作符返回每个用户的最后一个文档。请注意,如果我们按降序对文档进行排序,也可以使用累加器运算符,但按升序排序和使用
$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": {
    "_id": "$user._id",
    "user": "$user.user",
    "event": "$user.event",
    "group": "$user.group",
    "name": "$user.name",
    "text": "$user.text"
}}

你能把这三个搜索加在一起吗?而且,这3个搜索看起来非常不同。输出的数组似乎不合适,因为索引没有意义。@4castle-唯一可能的情况是不能应用限制。如何为每个用户标识第一个和最后一个文档。您不能依赖文档在集合中的顺序。@user3100115-应该声明,我的错。我可以使用“_id”作为排序,也可以使用每个文档都有的自定义“created”字段。我想你根本没有读过这个问题。我没有搜索特定用户,我需要返回每个用户、组和事件的第一个结果…看起来不错!虽然
用户
事件
具有相同ID的罕见事件会发生什么情况?它们是不同的集合,我的<代码>消息< /Cord>集合只是引用它们的ID。您不需要考虑这里的“事件”字段。您所需要的只是“用户”和“_id”或“已创建”字段,如您在文档中所述