使用 spring boot 在 mongodb 中获取以 2 个特定子字符串开头的字段?

Fetch fields starting with 2 particular substring in mongodb using springboot?

我正在尝试查找名字以 Ram 或 Shyam 开头的所有文档。 我尝试了以下在 mongoDb

中实际有效的方法
db.collection.find({
  $or: [
    {
      name: {
        $regex: "^Ram"
      }
    },
    {
      "name": {
        "$regex": "^Shyam"
      }
    }
  ]
})

我用这个发现得到了大约 4k 个文档。

现在,当我尝试将此 mongo shell 查询转换为 java 时。 事情确实有效,但只有以 Shyam 开头的名称会被过滤。结果,计数也减少到 2k。

有人可以看看下面的代码并告诉我为什么会这样吗? 为什么事情在 mongodb 中有效而不是在 java.

Java 等效代码 --

        MongoDatabase database = mongoClient.getDatabase("Friends");
        MongoCollection<Document> collection = database.getCollection("Friend");
        BasicDBObject filter = new BasicDBObject("$or", Arrays.asList
            (new BasicDBObject("name", new BasicDBObject("$regex", "^Ram")).append("name", new 
             BasicDBObject("$regex", "^Shyam"))));
        collection.find(filter).forEach((Consumer<Document>) doc -> {
                 // some java function
    }

根据您的 mongo 查询,您需要匹配 name 字段而不是 id 字段。错了

BasicDBObject filter = new BasicDBObject("$or", Arrays.asList
    (new BasicDBObject("name", new BasicDBObject("$regex", "^Ram"))
    .append("id", new //Here is the mistake
           BasicDBObject("$regex", "^Shyam"))));

应该是

    BasicDBObject filter = new BasicDBObject("$or", Arrays.asList
        (new BasicDBObject("name", new BasicDBObject("$regex", "^Ram"))
       .append("name", new BasicDBObject("$regex", "^Shyam"))));

我想通了。只有一件事,因为 $or 运算符总是采用数组 在我的 java 代码中,我已将其转换为数组,但只是忘记了不需要附加 .

解决方案将是--

BasicDBObject filter = new BasicDBObject("$or", Arrays.asList
            (new BasicDBObject("name", new BasicDBObject("$regex", "^Ram")),new BasicDbObject("name", new 
             BasicDBObject("$regex", "^Shyam"))));
        collection.find(filter).forEach((Consumer<Document>) doc -> {
                 // some java function
    }