【发布时间】:2015-04-23 12:06:49
【问题描述】:
如果我理解正确,这在 mongodb 中称为 projection。我已经看到有两种有用的投影运算符:elemMatch 和 $。
我有一组文档,每个文档都有一个属性列表(对象)。我想执行复杂的查询来匹配这些属性,即匹配它的几个字段(使用regex 等)。
现在,当文档与查询匹配时,Java 驱动程序将返回整个文档。我想对其进行过滤以仅返回与原始查询匹配的属性。
我尝试过结合elemMatch,但我所能完成的只是返回所有属性或仅返回一个(通常是第一个匹配项)。
Mongo 文档结构如下:
{
"name": "MediaPlayer",
"attributes": [
{
"tag": "media",
"values": [
"mp3",
"mp4"
]
},
{
"tag": "teste",
"values": [
"teste"
]
}
]
}
我的查询为:
{attributes : {$elemMatch: { 'tag' : 'media'},$elemMatch: { 'tag' : 'stream'}}}
它返回以下结果:
{
"name": "MediaStream",
"attributes": [
{
"tag": "media",
"values": [
"Edit"
]
},
{
"tag": "stream",
"values": [
"Edit"
]
},
{
"tag": "video",
"values": [
"Edit"
]
}
]
}
示例和返回的是不同的文档。虽然我匹配了two 属性,但我得到了整个列表。
我希望属性数组只包含匹配的元素。
我怎样才能做到这一点?
编辑:
据我所知,mongodb find 操作不支持内部数组过滤。有一些使用 mongodb 聚合框架的示例。除了手动过滤似乎是唯一可能的方法。
【问题讨论】:
-
您能给我们展示一些示例文档,您尝试过的代码和预期的结果吗?
-
@chridam 完成。如果还有什么需要请说。
-
@Saraiva
$elemMatch有这样的限制,它只返回匹配$elemMatch条件的第一个元素,如果你运行这个查询{"attributes":{"$elemMatch":{"tag":"media"}},"attributes":{"$elemMatch":{"tag":"teste"}}},{"attributes.$.tag":1}它只返回一个匹配数组而不是整个数组,所以如果你想找出所有匹配的数组然后应该使用 mongo 聚合 -
@yogesh 我了解如何通过使用 unwind 等技术获得它。但是,我不控制查询。我试图找到一种方法,以某种方式了解哪些属性成功匹配,而无需对查询内容有任何先验知识。我还没有找到可以做到这一点的聚合。我可以详细说明为什么我认为聚合可能不起作用..
标签: java mongodb mongodb-query mongodb-java