【问题标题】:Mongoose: Only return one embedded document from array of embedded documentsMongoose:仅从嵌入文档数组中返回一个嵌入文档
【发布时间】:2012-06-08 03:45:32
【问题描述】:

我有一个模型,其中包含一组嵌入式文档。该嵌入式文档跟踪用户在给定活动中获得的积分。由于用户可以是多个活动的一部分,也可以只是一个活动的一部分,因此将这些活动保存在一个数组中是有意义的。现在,我想提取名人堂,即给定活动的前十名用户。目前我正在这样做:

userModel.find({ "stats.activity": "soccer" }, ["stats", "email"])
.desc("stats.points")
.limit(10)
.run (err, users) ->

(如果您想了解语法,那就是coffeescript)

其中“stats”是嵌入文档/活动的数组。

现在这确实有效,但目前我只测试只有一项活动的帐户。我假设一旦用户有更多活动,就会出现问题(排序方式)。无论如何我可以告诉猫鼬只返回嵌入文档,其中“活动”==“足球”以及顶级文档?

顺便说一句,我意识到我可以通过另一种方式做到这一点,通过在它自己的集合中拥有统计信息并为相关用户提供一个 db-ref,但我想知道在我考虑任何重写之前是否可以这样做.

谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    你说得对,一旦你的数组中有多个活动,这将不起作用。

    具体来说,由于您不能只返回包含元素的数组的任意子集,因此您将取回所有元素,并且排序将应用于所有点,而不仅仅是与“活动”“配对”的点:“足球”。

    不过,您可以对架构进行一个非常简单的调整来解决这个问题。不要将活动名称存储为值,将其用作键。

    { _id: userId,
      email: email,
      stats: [
        {soccer : points},
        {rugby:   points},
        {dance:   points}
      ]
    }
    

    现在您将能够像这样查询和排序:

    users.find({"stats.soccer":{$gt:0}}).sort({"stats.soccer":-1})
    

    请注意,当您迁移到 2.2 版(目前仅作为不稳定的开发版本 2.1 提供)时,您将能够使用 aggregation framework 获得您想要的确切结果(仅与您的数组或子文档匹配的特定子集)查询)而不更改您的架构。

    【讨论】:

    • 有没有办法在不明确定义每个活动的情况下模拟这一点?照原样,如果您想添加一个“棒球”活动,您是否不必更改架构?
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2014-01-29
    • 2015-10-14
    • 2015-07-17
    • 2012-02-18
    • 2012-08-26
    • 2014-06-12
    相关资源
    最近更新 更多