Mongoose:仅从嵌入文档数组中返回一个嵌入文档

时间:2012-06-04 00:16:37

标签: node.js mongodb mongoose

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

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

(如果你想知道语法,那就是coffeescript)

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

现在这确实有效,但目前我只测试只有一个活动的帐户。一旦用户有更多活动,我认为会出现问题(按分类排序)。无论如何,我可以告诉mongoose只返回嵌入式文档,其中“activity”==“soccer”与顶级文档一起?

是的,我意识到我可以通过另一种方式做到这一点,通过在其自己的集合中使用统计数据并向相关用户提供db-ref,但我想知道在我考虑任何重写之前是否可以这样做

谢谢!

1 个答案:

答案 0 :(得分: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来获得所需的确切结果(仅限数组或子文档的特定子集)在不改变架构的情况下匹配您的查询。