Javascript 带有 MongoDB "$in" 运算符的查询生成器
Javascript Query Builder with MongoDB "$in" operator
所以我设置了一个查询生成器,它根据用户与前端数据过滤区域的交互来构建查询,该区域包含很多单选按钮和下拉框等。类似于 eBays 数据过滤功能在他们的网站上提供。
到目前为止我的查询生成器:
app.post('/user/test',function(req, res) {
var query = {};
if (req.body.region){
query.region = req.body.region
console.log(query.region)
}
if(req.body.sector){
query.sector = req.body.sector
console.log(query.sector)
}
if(req.body.client){
query.client = req.body.client
console.log(query.client)
}
Project.find(query, function(err, project){
if (err){
res.send(err);
}
console.log(project);
res.json(project);
});
});
现在上面的效果很好。我可以在任何情况下发送过滤选项,它会返回所需的结果。例如,我只能发送区域名称,它会给我属于该区域的所有数据,或者我可以发送区域名称、扇区名称,它会进一步过滤与发送的区域和扇区名称匹配的数据,等等。
问题:
现在我的数据库包含一组数据,例如:
words: ["book", "table", "pen"]
数据库中的每个对象都会有这个数组。因此,如果数据库中有 100 个对象,每个对象都有其中之一,则 "words" 数组具有不同或相似的值。
我希望能够将 "table" 、 "pen" 等多个选项发送到我的数据库,并获取数据数组中包含这两个选项的所有对象。
为了实现这一点,我做了以下事情:
if (req.body.sol){
var arr = [];
arr.push(req.body.sol)
query.words = {words: {$in: arr}}
}
上面的没用.
但是如果我对这一行进行以下更改:
来自
query.words = {words: {$in: arr}}
至
query = {words: {$in: arr}}
进行上述更改确实有效,但它不会构建剩余的查询。它只构建“$in”查询。
知道如何解决这个问题吗?
您可以使用 bracket notation 在查询属性中添加 $in
运算符:
if (req.body.sol){
var arr = [],
obj = {};
arr.push(req.body.sol);
obj["$in"] = arr;
query.words = obj;
}
您可以像这样简单地编写查询
query.words = {$in: arr}
这样您就可以构建查询的其余部分。
query.words = {words: {$in: arr}}
失败的原因是查询变成了{words:{words: {$in: arr}}}
,这不是您想要的,因为它试图在单词中查找单词。
而不是使用 query.words = {$in: arr}
将使您的查询 {words: {$in: arr}
所以我设置了一个查询生成器,它根据用户与前端数据过滤区域的交互来构建查询,该区域包含很多单选按钮和下拉框等。类似于 eBays 数据过滤功能在他们的网站上提供。
到目前为止我的查询生成器:
app.post('/user/test',function(req, res) {
var query = {};
if (req.body.region){
query.region = req.body.region
console.log(query.region)
}
if(req.body.sector){
query.sector = req.body.sector
console.log(query.sector)
}
if(req.body.client){
query.client = req.body.client
console.log(query.client)
}
Project.find(query, function(err, project){
if (err){
res.send(err);
}
console.log(project);
res.json(project);
});
});
现在上面的效果很好。我可以在任何情况下发送过滤选项,它会返回所需的结果。例如,我只能发送区域名称,它会给我属于该区域的所有数据,或者我可以发送区域名称、扇区名称,它会进一步过滤与发送的区域和扇区名称匹配的数据,等等。
问题:
现在我的数据库包含一组数据,例如:
words: ["book", "table", "pen"]
数据库中的每个对象都会有这个数组。因此,如果数据库中有 100 个对象,每个对象都有其中之一,则 "words" 数组具有不同或相似的值。
我希望能够将 "table" 、 "pen" 等多个选项发送到我的数据库,并获取数据数组中包含这两个选项的所有对象。
为了实现这一点,我做了以下事情:
if (req.body.sol){
var arr = [];
arr.push(req.body.sol)
query.words = {words: {$in: arr}}
}
上面的没用.
但是如果我对这一行进行以下更改:
来自
query.words = {words: {$in: arr}}
至
query = {words: {$in: arr}}
进行上述更改确实有效,但它不会构建剩余的查询。它只构建“$in”查询。
知道如何解决这个问题吗?
您可以使用 bracket notation 在查询属性中添加 $in
运算符:
if (req.body.sol){
var arr = [],
obj = {};
arr.push(req.body.sol);
obj["$in"] = arr;
query.words = obj;
}
您可以像这样简单地编写查询
query.words = {$in: arr}
这样您就可以构建查询的其余部分。
query.words = {words: {$in: arr}}
失败的原因是查询变成了{words:{words: {$in: arr}}}
,这不是您想要的,因为它试图在单词中查找单词。
而不是使用 query.words = {$in: arr}
将使您的查询 {words: {$in: arr}