假设我在Mongo中有以下文档:
{
"_id" : ObjectId("57e36c34eb2832aa68b39b26"),
"ap_domain" : "root",
"average_down" : 123,
"average_up" : 234,
"peak_down" : 123,
"peak_up" : 456,
"ssid_shaper_list" :
{
"SSID1" : {
"ssid_domain" : "root",
"peak_up" : 456,
"peak_down" : 456
},
"SSID2" : {
"ssid_domain" : "root",
"average_up" : 567,
"average_down" : 567,
"peak_up" : 456,
"peak_down" : 456
}
}
}
我需要检查本文档中是否存在SSID2
。这里我有3个键:
1. ap_domain = root
2. ssid_shaper_list = SSID2 and in it:
3. ssid_domain = root
如何使用BasicDBObject在java中编写搜索条件以检查是否存在所需的SSIDi?
答案 0 :(得分:2)
以下查询包含您的所有搜索条件:
SSID2
您无需检查ssid_shaper_list
中是否存在SSID2
,因为查询的第二部分会隐式执行此操作。
以下查询可用于获取ssid_shaper_list
数组中包含DBObject query = new BasicDBObject("ssid_shaper_list.SSID2", new BasicDBObject("$exists", true));
对象的文档。
user = double(image: urlurl)
allow(helper).to receive(:current_user).and_return(user)
expect(helper.get_user_header).to eq("/uploads/user/1/logo.png")
答案 1 :(得分:1)
ssid_domain = root的匹配已经暗示SSID2存在。因此,你有:
Filters.and(
Filters.eq("ap_domain", "root"),
Filters.eq("ssid_shaper_list.SSID2.ssid_domain", "root"));
在MongoCollection.find()方法中使用该过滤器。
答案 2 :(得分:1)
我认为您可以通过组合2.和3来简化搜索条件。因此您的查询将如下所示:
{ap_domain: 'root', 'ssid_shaper_list.SSID2.ssid_domain': 'root'}
第二个键使用点表示法指定嵌入文档,更多信息here
根据您的mongo驱动程序版本,您可能需要使用QueryBuilder(3.0之前),这将返回[Basic] DBObject,或Filters(3.0+),它将为您提供仍然可以使用的Bson查询使用相同的方式,看起来更干净。