2017-02-27 81 views
0

我有一个名为“Customer”的集合。MongoDB AddCriteria:查询不适用于DBRef列表

{ 
"_id" : ObjectId("588f43140cf2aa78e4da861d"), 
... 
//rest fields 
... 
"company_name" : "Customer", 
"address_id" : [ 
    { 
     "$ref" : "address", 
     "$id" : ObjectId("588f43140cf2aa78e4da861b") 
    }, 
    { 
     "$ref" : "address", 
     "$id" : ObjectId("588f43140cf2aa78e4da861c") 
    } 
], 
"parent_vendor_id" : { 
    "$ref" : "vendor", 
    "$id" : ObjectId("588f40e60cf2aa78e4da8611") 
} 
} 

而这个集合中我使用的“地址”的DBREF,通过address_id映射这是在列表的形式。

地址集合:

{ 
"_id" : ObjectId("588f40e60cf2aa78e4da860f"), 
"_class" : "com.bursys.bcf.domain.Address", 
... 
//rest fields 
... 
"city" : "Durham", 
"country" : "United States" 
} 

现在我想找出城市,客户和我使用

Query query = new Query(); 
query.addCriteria(where("address_id.$ref").is("address").and("address_id.city").is("Durham")); 

customers = mongo.find(query, Customer.class); 

但此查询,我没有得到结果。所以请纠正我... 任何形式的帮助将不胜感激... 在此先感谢

+0

请分享你的 “客户” 的模式。 –

回答

0

DBRef旨在被查询id参考。

考虑使用嵌入式文档address

{ 
    "_id": ObjectId("588f43140cf2aa78e4da861d"), 
    "company_name": "Customer", 
    "address": [{ 
     "city" : "Durham", 
     "country" : "United States" 
    }, { 
     "city" : "Bangalore", 
     "country" : "India" 
    }] 
} 

更新您的查询

Query query = new Query(); 
query.addCriteria(where("address.city").is("Durham")); 
customers = mongo.find(query, Customer.class); 
+0

嘿Veeram,感谢您的帮助,但我不想添加地址作为子文件,因为它使收集庞大。这就是为什么使用DBRef寻找解决方案的原因。 –

+0

就像我说过那是不可能的。我希望你不用关系型数据库来思考它。它将作为嵌入式文档高效且易于查询。如果你坚持保持这种方式,那么你必须通过地址中的_id'来访问它。另一种解决方案虽然不需要,但是为地址创建单独的集合并使用'$ lookup'来加入地址 – Veeram