当前位置: 首页 > 知识库问答 >
问题:

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

贺景山
2023-03-14

在我的项目中,我将一个参数从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>());

其中,“名称”是从 JSP 传递的参数。

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

提前感谢。

共有2个答案

刁璞
2023-03-14

1)它不会被编译,因为需要几个 com.mongodb.client.model.filters 作为参数,例如单个 2) 名称变量中的多个 eq 子句
用于过滤地址年龄字段,您应该使用相应的请求参数。否则,您将无法获得正确的结果。

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>());

在Java 8 MongoDB 3.4上使用mongodb-driver v3.5.0进行测试(使用硬编码的值,而不是解析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,名称=名称-1,地址=地址-1,年龄=年龄-1}} 文档{{_id=59de7992bb63df2984a4d4a4,名称=名称-3,地址=地址-3,年龄=年龄-3}} 文档{{_id=59de7992bb63df2984a4d4a5,名称=名称-4,地址=地址-4,年龄=年龄-4}}

干善
2023-03-14

以防万一:<code>请求。getParameter(“name”)可以包含nameaddressage(因此需要应用单个“或”ed查询)中的任何一个。以下方法将有效。

假设你的同事有以下文件:

{
    "_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))
 类似资料:
  • 我对JSP/servlets相当陌生,我一直在研究一些东西,它已经工作了一段时间。我有一个名为'telgir.jsp'的jsp,我从这个jsp向一个名为'tel Kayit'的servlet传递一个URL参数。 在LocalHost上运行时JSP页面的一个示例URL: 当我在servlet中接收到参数时,参数发生了变化,因此无法正确地对其进行解码并获得结果。根据我的研究,我意识到“%”符号使我的代

  • 问题内容: 我正在尝试为我的应用程序编写查询,但是遇到了一些麻烦。我需要将数据库的一个字段作为参数传递,例如: 因为WHERE子句和ORDER BY子句是动态的,所以用户可以选择。 使用它没有用。 问题答案: JasperReports中 有两个用于参数引用的语法表达式: 和和 。 $ P {paramName}语法 主要用于设置 WHERE 输入参数值。替换算法是“智能”的,其实现使用java.

  • 本文向大家介绍Mybatis传递多个参数进行SQL查询的用法,包括了Mybatis传递多个参数进行SQL查询的用法的使用技巧和注意事项,需要的朋友参考一下 PS:ibatis3如何传递多个参数有两个方法:一种是使用java.Map,另一种是使用JavaBean。 当只向xxxMapper.xml文件中传递一个参数时,可以简单的用“_parameter”来接收xxxMapper.java传递进来的参

  • 我有一个如下所示的graphql查询: 因此,名称和电子邮件将由名为详细信息的其余endpoint解析,但是地址字段需要由另一个名为地址的其余endpoint解析。>rest终结点还需要在中传递的(因为我的rest服务需要该字段)。我不确定,在这种情况下,我如何设计我的解析器? 同样,一个字段一旦解析,是否可以将数据发送到另一个字段?这在grapqhql中可能吗?

  • 我的项目中有一个查询来检索游戏列表并将其显示在LazyColumn中。当我查询整个集合时,它可以正常工作,但我想在片段中放一个wherite子句,它需要2个参数,我必须在片段中传递,但我不知道如何用Jetpack compose传递它。 下面是已经到位并正在工作的查询: 我需要在appModule中添加.where(PLAYERS,listOf(user1+“”+user2,user2+“”+us

  • 问题内容: 我想将数组作为参数传递给SqlQuerySpec,以便在构建对天蓝色的db数据库的查询时可以在IN表达式中使用它。我想做的是像我们对常规参数(字符串,整数等)所做的事情: 但是,这种方式是行不通的。我还有其他方法可以将数组作为参数传递吗?谢谢。 问题答案: 您的查询应如下所示: 那么您可以将其作为数组传递,并检查该数组是否包含文档中属性中具有的值。 参考: https://docs.m