下面的mongodb查询不返回文档。查询有什么问题?我想指定$where
以匹配数组中的元素
[编辑] 上面的问题是我的方案的简化版本。我正在使用一个弹簧数据 mongodb 存储库。我想使用@Query
注释指定查询。希望$where
部分是简单的比较,而不是一个完整的JavaScript函数。类似的东西
@Query ( value=" { flag: true, $where: "this.versions.version == this.defaultVersion "}", fields = "{'versions' : 1}" )
Foo getDefaultVersion();
如果$where
语法不正确,请提出替代方案。
db.foo.find({
flag: true,
$where: "this.versions.version == this.defaultVersion " },
{ 'versions' : 1}
});
收集:
{
flag: true,
defaultVersion: "1.0",
versions: [
{
version: "1.0",
tags: ["abc", "def"]
},
{
version: "1.1",
tags: ["abc", "def"]
}
]
}
我想从版本数组中获取"版本"子文档,该数组将匹配版本作为默认版本属性。
[编辑2] 我能够使用$elemMatch缩小范围
db.foo.find({
flag: true,
versions: { $elemMatch : { version: '1.0' } }
},
{ 'versions' : 1}
});
在上面代替硬编码'1.0'
,我想指定文档的默认版本。不确定如何实现它?
应避免使用 $where
运算符,因为它都会调用完整的集合扫描,而不管其他条件可能使用索引选择。
此外,你在每个结果文档上调用 JavaScript 解释器,这将比本机代码慢得多。阅读手册页上的警告,它们的存在是有原因的
在可能的情况下,请尝试使用.aggregate()
进行此类比较。在您的情况下,这绝对是更好的选择:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
这允许您首先按"flag"条件过滤查询,然后检查数组的每个成员以比较两个字段是否相同。
如有必要,您可以将匹配的数组元素回滚到有多个匹配项的数组中。但我不认为这是你的要求。
试试这个:
db.so.find({
flag: true,
$where: function () {
var versions = this.versions;
for (var i=0; i<versions.length; i++) {
if (versions[i].version == this.defaultVersion) return true;
}
}
});
[编辑]杰克编辑了他的问题,说他不想使用JavaScript函数,而是一个简单的表达式。 我认为这是不可能的。