【发布时间】:2018-07-02 15:22:33
【问题描述】:
我正在使用 spring 数据包中的 @Query,我想查询文档中数组的 last 元素。
例如数据结构可能是这样的:
{
name : 'John',
scores: [10, 12, 14, 16]
},
{
name : 'Mary',
scores: [78, 20, 14]
},
所以我建立了一个查询,但是它抱怨 “错误消息 'unknown operator: $slice' on server”
查询的 $slice 部分在单独运行时很好:
db.getCollection('users').find({}, {scores: { $slice: -1 })
但是,一旦我将它与更复杂的检查结合起来,就会出现上述错误。
db.getCollection('users').find{{"$and":[{ } , {"scores" : { "$slice" : -1}} ,{"scores": "16"}]})
此查询将返回最后得分为 16 的用户列表,在我的示例中将返回 John,但不返回 Mary。
我已将其放入标准的 mongo 查询中(用于调试事物),但理想情况下我需要将其放入 spring-data @query 构造中 - 它们应该非常相似。
有没有办法做到这一点,而不求助于手动 java 调用?除了需要标准查询之外,我没有看到太多关于 @Query 的文档。
正如链接帖子所评论的那样,它指的是聚合,它如何与@Query一起使用,加上主要答案之一使用$where,这效率低下。
【问题讨论】:
-
@Veeram 我在那里看不到合适的答案,他们要么使用聚合 - 这在 @Query 指令中如何工作 - 我在文档中看不到任何内容,也是主要答案之一使用$where 又不适合,因为它非常慢。可能有 1000 个条目。
-
没有@Query 答案。我认为最好的答案是以相反的顺序存储文档,您可以在其中访问具有 .0 索引的顶部文档。像
db.getCollection('users').find({"scores.0": 16})这样的东西。如果这不是一个选项,您必须使用 MongoTemplate 来访问聚合方法。 -
想一想你现在可以使用 3.6 中的
$expr运算符在查找查询中使用聚合函数。所以像@Query 中的{$expr:{$gt:[{$arrayElemAt:["scores", -1]}, 16]}}这样的东西。您可以在 3.6 shell 中尝试db.getCollection('users').find({$expr:{$gt:[{$arrayElemAt:["scores", -1]}, 16]}})。我已经更新了链接的帖子以包含新的答案。在 Spring Query 指令中测试并且它有效!试试@Query("{$expr:{$gt:[{$arrayElemAt:[\"scores\", -1]}, ?0]}}") -
@Veeram 谢谢,我会看看是否可以在我的环境中使用它。