gpt4 book ai didi

java - 查找状态为a、b或c并且有一些大于0的数组的MongoDB记录

转载 作者:行者123 更新时间:2023-12-02 04:28:29 24 4
gpt4 key购买 nike

我正在努力构建针对其中一个条件的查询,我有这样的文档:

[
{
"status": "a"
},
{
"status": "b"
},
{
"status": "foo"
},
{
"status": "a",
"flightDetails": [
{
"test": "xyz"
}
]
}
]

我的选择标准是这样的:

  • 获取状态为 abc 的所有数据,或者
  • 获取状态为 abcflightDetails 的所有数据,其大小为 > 0
  • 并非所有文档都包含 flightDetails 键。

我尝试了这样的java代码:

BasicDBObject inQuery = new BasicDBObject();
inQuery.append("status", new BasicDBObject("$nin", Arrays.asList("a", "b", "c")));

BasicDBObject inQuery2 = new BasicDBObject();
inQuery2.append("$where", "return Object.keys( this.flightDetails").length > 0");

BasicDBList criteria = new BasicDBList();
criteria.add(inQuery);
criteria.add(inQuery2);

BasicDBObject finalQuery = new BasicDBObject("$or",criteria);

但是它返回了所有数据,看来我的查询不正确。我搜索了很多,并根据一些答案,我尝试构建查询。有人可以帮我吗?因为我是 NoSQL 和 MongoDB 的初学者,并且是在这几天开始的。

最佳答案

对数组的“0”元素使用点符号以及 $exists意味着它有一些内容,并且当然存在:

BasicDBObject query = BasicDBObject("status", 
new BasicDBObject("$in", Arrays.asList("a", "b", "c"))
)
.append("flightDetails.0",
new BasicDBObject("$exists",true)
);

这是:

{
"status": { "$in": [ "a","b","c" ] },
"flightDetails.0": { "$exists": true }
}

对于那些习惯了 JSON 表示法的人。

要合并“根本没有数组”,只需构造 $or 条件:

{
"status": { "$in": [ "a","b","c" ] },
"$or": [
{ "flightDetails.0": { "$exists": true } },
{ "flightDetails": { "$exists": false } }
]
}

或者对于 Java:

BasicDBObject query = BasicDBObject("status", 
new BasicDBObject("$in", Arrays.asList("a", "b", "c"))
)
.append("$or",Arrays.<Object>asList(
new BasicDBObject("flightDetails.0",
new BasicDBObject("$exists",true)
),
new BasicDBObject("flightDetails",
new BasicDBObject("$exists",false)
)
));

关于java - 查找状态为a、b或c并且有一些大于0的数组的MongoDB记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31830504/

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