使用 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
}
我正在尝试查找名字以 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
}