作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我希望能够使用具有多个 OR 的 Node 动态构建 Mongo 查询。此查询的目的是使用多个搜索词在数据库中执行 AND 搜索。
例如,假设有人想搜索包含单词“dog”和“cereal”的记录。查询只会返回记录中某处包含“狗”和“ Cereal ”的记录(即搜索词可以出现在不同的列中)。
我知道查询最终应该是这样的:
query = {
$and: [
{$or: [
{col1: {$regex: "first", $options: "i"}},
{col2: {$regex: "first", $options: "i"}}
]},
{$or: [
{col1: {$regex: "second", $options: "i"}},
{col2: {$regex: "second", $options: "i"}}
]}
]
}
但是,我的 Node 代码不会产生这个。这是我最接近解决这个问题的方法:
var regexQueryWrapper = {};
regexQueryWrapper["$and"] = [];
var wrapper = {};
wrapper["$or"] = [];
var query = {};
searchTerms.forEach(function(term) {
searchFields.forEach(function(field) {
query[field] = {$regex: term, $options: 'i'};
wrapper["$or"].push(query);
});
regexQueryWrapper["$and"].push(wrapper);
});
最好的方法是什么?我是否缺少其他方法?
最佳答案
你很接近。您似乎在重用对象。下面是一些调整后的代码,用于构建您要查找的查询,并在每次 forEach 迭代时重新初始化临时对象:
var regexQueryWrapper = {};
regexQueryWrapper["$and"] = [];
searchTerms.forEach(function(term) {
var wrapper = {"$or": []};
searchFields.forEach(function(field) {
var query = {};
query[field] = {$regex: term, $options: 'i'};
wrapper["$or"].push(query);
});
regexQueryWrapper["$and"].push(wrapper);
});
还有一个使用 map
的替代实现:
var query = {"$and": searchTerms.map(function(term) {
return {"$or": searchFields.map(function(field) {
var o = {};
o[field] = {"$regex": term, "$options": "i"};
return o;
})};
})};
关于javascript - 如何使用多个 OR 动态构建 MongoDB 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45068245/
我是一名优秀的程序员,十分优秀!