gpt4 book ai didi

java - MongoDB 查询匹配单个条目和数组元素

转载 作者:行者123 更新时间:2023-11-30 07:08:04 24 4
gpt4 key购买 nike

我在使用 MongoDB QueryBuilder 时遇到问题。

假设我有许多文档,其中可以包含一个或多个用户:

{
"_id": "document1",
"data": {
"user": {
"credentials": {
"name": "John",
"lastname": "Watson",
"middle": "Hemish"
}
}
}
}


{
"_id": "document2",
"data": {
"user": [
{
"credentials": {
"name": "John",
"lastname": "Nicholson",
"middle": "Joseph"
}
},
{
"credentials": {
"name": "Mary",
"lastname": "Watson",
"middle": ""
}
}
]
}
}


{
"_id": "document3",
"data": {
"user": [
{
"credentials": {
"name": "John",
"lastname": "Watson",
"middle": "Hemish"
}
},
{
"credentials": {
"name": "John",
"lastname": "Nicholson",
"middle": "Joseph"
}
},
{
"credentials": {
"name": "Mary",
"lastname": "Watson",
"middle": ""
}
}
]
}
}

我想做的是查询,它将仅返回包含 John Watson 作为用户的文档。

这是我到目前为止得到的:

1.

QueryBuilder qb = QueryBuilder.start("credentials.lastname").is("Watson").and("credentials.name").is("John");
DBObject query = QueryBuilder.start("data.user").elemMatch(qb.get()).get();

此查询将仅返回 document3:document1 中没有数组,document2 中没有匹配项(但我希望它返回 document1 和 document3)

2.

DBObject query = QueryBuilder.start("data.user.credentials.lastname").is("Watson").and("data.user.credentials.name").is("John").get();

这个将返回所有三个文档:document1 和 document3 是所需的匹配,但查询也将匹配 document2,因为它在数组的查询字段中有 Watson 和 John,无论它们是单独的条目。

有没有办法进行正确的查询,为 John Watson 返回 document1 和 document3?

我正在尝试用 Java 来实现,但任何其他示例都可以。

现在,我使用一种解决方法来组合两个查询的结果:首先,我使用 elementMatch() 从查询中获取 limit(100) 个结果,然后,如果结果少于 100 个,我会执行第二个查询并过滤所有错误火柴。但我希望有更好、更有效的方法来获得这些结果。

最佳答案

我最多可以给你像下面这样的内容,其中user将在数组中作为键data的展开值。我认为多一点努力就会让你得到你想要的确切格式。

我分享它是因为我认为它应该达到目的或者无论如何它应该对您有所帮助。

聚合查询:

db.tuttut.aggregate([
{$unwind:"$data.user"},
{ $project: {
_id:1,
data:1,
temp: {name:"$data.user.credentials.name",
lastname:"$data.user.credentials.lastname"}
} } ,
{ $group:{
_id:"$_id" ,
data: {$addToSet: "$data"} ,
temp:{ $addToSet: "$temp" } } },
{ $match:{ temp:{name:"John",lastname:"Watson"} } } ,
{$project:{_id:1, data:1}}
]).pretty()

返回结果:

{
"_id" : "document1",
"data" : [
{
"user" : {
"credentials" : {
"name" : "John",
"lastname" : "Watson",
"middle" : "Hemish"
}
}
}
]
}
{
"_id" : "document3",
"data" : [
{
"user" : {
"credentials" : {
"name" : "John",
"lastname" : "Watson",
"middle" : "Hemish"
}
}
},
{
"user" : {
"credentials" : {
"name" : "Mary",
"lastname" : "Watson",
"middle" : ""
}
}
},
{
"user" : {
"credentials" : {
"name" : "John",
"lastname" : "Nicholson",
"middle" : "Joseph"
}
}
}
]
}

关于java - MongoDB 查询匹配单个条目和数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39725551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com