如何只使用Mongoose返回第一次出现的ID?

时间:2016-06-02 03:51:29

标签: 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,
   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而不是useruserevent

以上的最终结果将是:

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,只有groupevent s。

2 个答案:

答案 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}])