MongoDB使用从JSP传递的参数查询“OR”运算符

时间:2017-10-11 18:46:30

标签: java mongodb jsp servlets mongodb-query

在我的项目中,我将一个参数从JSP传递给servlet并将其接收为:

String name= request.getParameter("name");

我成功使用以下查询使用名称字段搜索集合中的记录,如下所示:

List<Document> names= collection.find(eq("name", name)).into(new ArrayList<Document>());

我的下一步是从JSP中的用户获取任何字段(名称,地址,年龄),并在具有该字段的mongodb中搜索记录(由用户输入)并显示结果。为此我没有成功尝试使用:

 List<Document> names= collection.find(or("name", name),("address", name),("age", name)).into(new ArrayList<Document>());

其中“name”是从JSP传递的参数。

我想知道如何修改上述查询,以便用户输入的任何内容(名称,地址,年龄),查询将搜索该记录并为我返回结果。 在我尝试使用“或”的上述查询中,它不会多次使用“name”参数。我想知道我在查询中使用的语法。甚至“或”似乎与“eq”不同。

提前致谢。

2 个答案:

答案 0 :(得分:0)

1)它不会被编译,因为or需要多个com.mongodb.client.model.Filters作为参数,例如单个eq中的多个or子句
2)name变量用于过滤addressage字段,您应该使用相应的请求参数。否则你将得不到正确的结果。

更正代码

String name = request.getParameter("name");
String address = request.getParameter("address");
String age = request.getParameter("age");


List<Document> names = collection.find(or(eq("name", name), eq("address", address), eq("age", age))).into(new ArrayList<Document>());

完全正常工作

使用mongodb-driver v3.5.0在Java 8 + MongoDB 3.4上测试(使用硬编码值而不是解析jsp请求对象):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.mongodb.*;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import static com.mongodb.client.model.Filters.*;

public class Main {

    public static void main(String[] args) {

        try {

            // Dummy connection
            MongoClient client = new MongoClient();
            MongoDatabase database = client.getDatabase("stackoverflow_test_db");
            MongoCollection<Document> collection = database.getCollection("stackoverflow_test_col");

            // Dummy data
            collection.insertMany(Arrays.asList(
                    Document.parse("{name:'name-1', address:'address-1', age:'age-1'}"),
                    Document.parse("{name:'name-2', address:'address-2', age:'age-2'}"),
                    Document.parse("{name:'name-3', address:'address-3', age:'age-3'}"),
                    Document.parse("{name:'name-4', address:'address-4', age:'age-4'}"),
                    Document.parse("{name:'name-5', address:'address-5', age:'age-5'}")
            ));

            // Hardcoded filters. Pretend like we got this with request.getParameter
            String name = "name-1";
            String address = "address-3";
            String age = "age-4";

            // Lookup
            List<Document> names= collection.find(or(
                eq("name", name), 
                eq("address", address),
                eq("age", age))).into(new ArrayList<>());

            // Print results
            names.forEach(System.out::println);

            // Clear storage
            collection.drop();
        } catch (MongoException e) {
            e.printStackTrace();
        }
    }
}

输出

  

文件{{_ id = 59de7992bb63df2984a4d4a2,name = name-1,address = address-1,age = age-1}}   文件{{_ id = 59de7992bb63df2984a4d4a4,name = name-3,address = address-3,age = age-3}}   文件{{_ id = 59de7992bb63df2984a4d4a5,name = name-4,address = address-4,age = age-4}}

答案 1 :(得分:0)

以防万一:request.getParameter("name")可以包含nameaddressage中的任何一个(因此需要应用单个&#39; OR&#39 ; ed query)以下内容可行。

假设您的收藏品有以下文件:

{
    "_id" : ObjectId("59de76eddcc75598230985eb"),
    "name" : "John",
    "address" : "Baker Street",
    "age" : 54
}

{
    "_id" : ObjectId("59de770bdcc75598230985ec"),
    "name" : "Joe",
    "address" : "Main Street",
    "age" : 48
}

{
    "_id" : ObjectId("59de771adcc75598230985ef"),
    "name" : "Jane",
    "address" : "Baker Street",
    "age" : 54
}

以下代码将返回您期望的文档(我想!):

String parameterValue = "John";
Bson filter = Filters.or(Filters.eq("name", parameterValue), Filters.eq("address", parameterValue), Filters.eq("age", parameterValue));
FindIterable<Document> documents = collection.find(filter);

for (Document d : documents) {
    // displays:
    //  { "_id" : { "$oid" : "59de76eddcc75598230985eb" }, "name" : "John", "address" : "Baker Street", "age" : 54 }
    logger.info(d.toJson());
}

parameterValue = "Baker Street";
filter = Filters.or(Filters.eq("name", parameterValue), Filters.eq("address", parameterValue), Filters.eq("age", parameterValue));
documents = collection.find(filter);

for (Document d : documents) {
    // displays:
    //  { "_id" : { "$oid" : "59de76eddcc75598230985eb" }, "name" : "John", "address" : "Baker Street", "age" : 54 }
    //  { "_id" : { "$oid" : "59de771adcc75598230985ef" }, "name" : "Jane", "address" : "Baker Street", "age" : 54 }
    logger.info(d.toJson());
}

parameterValue = "48";
filter = Filters.or(Filters.eq("name", parameterValue), Filters.eq("address", parameterValue), Filters.eq("age", Integer.valueOf(parameterValue)));
documents = collection.find(filter);

for (Document d : documents) {
    // displays:
    //  { "_id" : { "$oid" : "59de770bdcc75598230985ec" }, "name" : "Joe", "address" : "Main Street", "age" : 48 }
    logger.info(d.toJson());
}

关键是ORed查询的结构如下所示:

Filters.or(condition, condition, ...)

例如:

Filters.or(Filters.eq("name", parameterValue), Filters.eq("address", parameterValue), Filters.eq("age", parameterValue))