2012-07-28 32 views
13

Tôi đang cố gắng truy vấn mongodb bằng cách sử dụng mùa xuân. Chúng tôi có một bộ sưu tập chứa một cây và bao gồm một danh sách các mục như là một đường dẫn cây (vì vậy chúng tôi có thể dễ dàng đi qua cây). Chúng ta có một truy vấn cần trả về tất cả các nút con của một nút cụ thể. Truy vấn của chúng tôi dựa trên việc chọn tất cả các nút có nút (cha mẹ) trong đường dẫn và là một cấp thấp hơn cấp độ gốc (cấp độ). tiêu chí của chúng tôi là như sau:Tiêu chí Mongo mùa xuân truy vấn hai lần cùng một trường

Criteria.where("treePath").in(parentId).and("treePath").size(level) 

Than ôi, khi chúng tôi gọi đây là trên MongoDB chúng tôi nhận được ngoại lệ sau đây:

org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Do để hạn chế của com .mongodb.BasicDBObject, bạn không thể thêm biểu thức 'treePath' thứ hai được chỉ định là 'treePath: {"$ size": 2}'. Tiêu chí đã chứa 'treePath: {"$ in": [ "50137df5f49f9b4a6481d639"]}'.

Có đề xuất nào khác về cách đạt được điều tương tự không? Một lựa chọn tôi đã nghĩ đến là truy vấn mongodb trực tiếp. Tôi đã thử

String command = "{findAndModify:\"Task\",query:{$and:[{treePath:\"5013a79a36600872ecf4dba8\"},{treePath:{$size:2}},{order:{$gte:0}}]},update:{$inc:{order:1}}}"; 
CommandResult commandResult = mongoTemplate.executeCommand(command); 

Nhưng điều này sẽ chỉ cập nhật hồ sơ đầu tiên và tôi cần tất cả chúng được cập nhật.

Cảm ơn!

Trả lời

24

này sẽ làm những gì bạn muốn:

int parentId = 100; 
int level = 5; 
Criteria c = new Criteria().andOperator(Criteria.where("treePath").is(parentId), 
             Criteria.where("treePath").size(level)); 
System.out.println(c.getCriteriaObject()); 

It in

{ "$and" : [ { "treePath" : 100} , { "treePath" : { "$size" : 5}}]} 
+0

cảm ơn! làm việc tuyệt vời! – checklist

+0

Sử dụng orOperator, bạn có thể truy vấn các giá trị khác nhau của cùng một trường, nếu đó là những gì bạn cần làm. – hypercube

Các vấn đề liên quan