首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongoose:从嵌入文档数组中仅返回一个嵌入文档

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

Stack Overflow用户
提问于 2012-06-04 08:16:37
回答 1查看 1.4K关注 0票数 0

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

代码语言:javascript
运行
复制
userModel.find({ "stats.activity": "soccer" }, ["stats", "email"])
.desc("stats.points")
.limit(10)
.run (err, users) ->

(如果你想知道它的语法,它是coffeescript)

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

现在,这实际上是有效的,但目前我只测试了只有一个活动的帐户。我假设一旦用户有了更多的活动,就会出问题(排序)。有没有什么办法我可以告诉mongoose只返回嵌入的文档,其中"activity“和”==“在顶级文档旁边?

顺便说一句,我意识到我可以通过另一种方式来做这件事,通过在它自己的集合中有一个stats,并有一个相关用户的db-ref,但我想知道在我考虑任何重写之前是否可以这样做。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-04 10:29:48

你是对的,一旦你的数组中有多个活动,这就不会起作用。

具体地说,因为您不能只返回带有元素的数组的任意子集,所以您将返回所有元素,并且排序将应用于所有点,而不仅仅是与“activity”“配对”的那些点。

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

代码语言:javascript
运行
复制
{ _id: userId,
  email: email,
  stats: [
    {soccer : points},
    {rugby:   points},
    {dance:   points}
  ]
}

现在,您可以像这样查询和排序:

代码语言:javascript
运行
复制
users.find({"stats.soccer":{$gt:0}}).sort({"stats.soccer":-1})

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10875044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档