【发布时间】:2017-10-12 23:44:21
【问题描述】:
我想使用 mongo 投影来向我的应用程序返回更少的数据。我想知道这是否可能。
例子:
user: {
id: 123,
some_list: [{x:1, y:2}, {x:3, y:4}],
other_list: [{x:5, y:2}, {x:3, y:4}]
}
如果查询user_id = 123 和一些“投影过滤器”,例如user.some_list.x = 1 和user.other_list.x = 1,是否有可能达到给定的结果?
user: {
id: 123,
some_list: [{x:1, y:2}],
other_list: []
}
我们的想法是让 mongo 工作得更多一些,并为应用程序检索更少的数据。在某些情况下,我们会在应用程序端丢弃 80% 的集合元素。所以,最好不要再回来了。
问题:
- 有可能吗?
- 我怎样才能做到这一点。 $elemMatch 似乎对我没有帮助。我正在尝试放松,但没有达到目标
- 如果可能的话,这种投影过滤是否可以从
user.some_list.x上的索引中受益?或者一旦用户已经通过它的 id 找到了,就根本没有?
谢谢。
【问题讨论】:
-
"$elemMatch 似乎对我没有帮助" 那么您实际尝试了什么?似乎
db.user.find({},{ "some_list": { "$elemMatch": { "x": 1 } }, "other_list": { "$elemMatch": { "x": 1 } } })完全符合您的要求。请注意,有 两个 不同的$elemMatch运算符,其中链接的一个是“投影”运算符。你可以用.aggregate()做更多花哨的事情,但是一个简单的“奇异”匹配是由那个非常简单的案例来处理的。 -
我在文档中找到了这一点:“$elemMatch 运算符将查询结果中的
字段的内容限制为仅包含与 $elemMatch 条件匹配的第一个元素。”。在我的示例中,有一个元素与过滤器 user.some_list.x = 1匹配,但在我的实际情况中,数组中可以存在多个匹配过滤条件的元素。
标签: mongodb indexing mongodb-query filtering projection