是否可以在两个给定字段中仅查找具有相同值的集合中的那些文档?
{
_id: 'fewSFDewvfG20df',
start: 10,
end: 10
}
由于此处start
和end
具有相同的值,因此将选择此文档。
我想像......
Collection.find({ start: { $eq: end } })
...这不会起作用,因为end
必须是一个值。
答案 0 :(得分:5)
这里有两种选择。第一个是使用$where
运算符。
Collection.find( { $where: "this.start === this.end" } )
第二种选择是使用聚合框架和$redact
运算符。
Collection.aggregate([
{ "$redact": {
"$cond": [
{ "$eq": [ "$start", "$end" ] },
"$$KEEP",
"$$PRUNE"
]
}}
])
哪一个更好?
$where
运算符执行JavaScript评估,无法利用索引,因此使用$where
进行查询可能会导致应用程序性能下降。见considerations。如果你使用$,你的每个文件将在$ where操作之前从BSON转换为JavaScript对象,这将导致性能下降。当然,如果您有索引过滤器,则可以改进查询。如果您根据用户输入动态构建查询,也存在安全风险。
$redact
之类的$where
并不使用索引甚至执行收集扫描,但是当您$redact
时,查询性能会提高,因为它是标准的MongoDB运算符。这就是说聚合选项要好得多,因为你总是可以使用$ match运算符过滤你的文档。
$where
这里很好,但可以避免。另外,我相信当您遇到架构设计问题时,您只需要$where
。例如,在索引文档中添加另一个布尔字段可能是一个不错的选择。
答案 1 :(得分:0)
此查询速度很快,因为涉及的函数调用次数最少,
Collection.find("this.start == this.end");