Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose:从嵌入文档数组中只返回一个嵌入文档_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose:从嵌入文档数组中只返回一个嵌入文档

Node.js Mongoose:从嵌入文档数组中只返回一个嵌入文档,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个模型,其中包含一组嵌入文档。此嵌入文档跟踪用户在给定活动中获得的分数。由于用户可以是多个活动的一部分,也可以只是一个活动,因此将这些活动保存在一个数组中是有意义的。现在,我想提取名人堂,一个给定活动的前十名用户。目前我是这样做的: userModel.find({ "stats.activity": "soccer" }, ["stats", "email"]) .desc("stats.points") .limit(10) .run (err, users) -> (如果你想

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

userModel.find({ "stats.activity": "soccer" }, ["stats", "email"])
.desc("stats.points")
.limit(10)
.run (err, users) ->
(如果你想知道语法,那就是coffeescript)

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

现在这确实有效,但目前我只对只有一个活动的帐户进行测试。我假设,一旦用户有更多的活动,就会出现问题(排序方面)。我是否可以告诉mongoose只返回嵌入的文档,其中“activity”==“soccer”与顶级文档一起

BTW,我意识到我可以用另一种方式来做,通过在它自己的集合中拥有统计信息,并向相关用户提供DB REF,但是我想知道在我考虑重写之前是否可以这样做。


谢谢

如果阵列中有多个活动,则此操作将不起作用,这是正确的

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

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

{ _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提供)时,您将能够在不更改模式的情况下使用以获得所需的确切结果(仅与查询匹配的数组或子文档的特定子集)。

是否有方法在不显式定义每个活动的情况下模拟此操作?如果你想,比如说,添加一个“棒球”活动,你不需要改变模式吗?