2013-02-26 26 views
11

Tôi có tài liệu trong bộ sưu tập như thế này, tôi cần tìm bản ghi với form_Id: 1 và Function_Id: 2, cách viết truy vấn mongo.Cách viết truy vấn Mongo để tìm tài liệu phụ với điều kiện

"Form_Id" : 1, 
"Function" : [{ 
    "Function_Id" : 1, 
    "Role" : [{ 
     "Role_Id" : 1, 
     "UserId" : ["Admin", "001"] 
    }] 
}, { 
    "Function_Id" : 2, 
    "Role" : [{ 
     "Role_Id" : 2, 
     "UserId" : ["Admin", "005"] 
    }] 
}] 
+0

là khả năng nào có được kỷ lục như thế này '{ " Hàm_Id ": 2, " Vai trò ": [{ " Vai trò_Id ": 2, " UserId ": [" Quản trị "," 005 "] } 'là kết quả của tôi. – siva

Trả lời

24

Bạn có thể sử dụng ký hiệu dấu chấm và các nhà điều hành dự báo vị trí $ để làm điều này:

db.test.find({Form_Id: 1, 'Function.Function_Id': 2}, {_id: 0, 'Function.$': 1}) 

lợi nhuận:

{"Function": [{"Function_Id": 2, "Role": [{"Role_Id": 2, "UserId": ["Admin", "005"]}]}]} 
+0

@JhonnyHK Tôi đã thử câu trả lời của bạn, kết quả như thế này '{" Function ": [{}, {}]}', tôi có thể biết những gì đang làm sai trong này. – siva

+0

@JhonnyHK Tôi không biết nơi tôi đã làm sai, truy vấn của bạn đã cho kết quả chính xác, tôi đã thử cùng với ứng dụng C# như 'var Logs = db.GetCollection ("Access_Rights") Tìm kiếm (truy vấn) .SetFields (Fields.Exclude ("_ id", Function.Role ")). SetFields (Fields.Include (" Function. $ "));' Đang làm đúng xin vui lòng hướng dẫn tôi. – siva

5

Vì phím chức năng của bạn là mảng, để sử dụng toán tử đối sánh $, trước tiên bạn phải sử dụng toán tử $ relax. http://docs.mongodb.org/manual/reference/aggregation/unwind/ Và sau đó bạn sử dụng $ điều hành trận đấu để tìm thấy những tài liệu mà bạn muốn http://docs.mongodb.org/manual/reference/aggregation/match/

Vì vậy, câu hỏi của bạn sẽ trông như thế này

db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}}]) 

By Mongo mặc định sẽ hiển thị _id của tài liệu. Vì vậy, nếu bạn không muốn hiển thị _id, sau khi phù hợp với những người có liên quan, bạn có thể sử dụng toán tử $ dự án http://docs.mongodb.org/manual/reference/aggregation/project/

 db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Form_id":1,"Function":1}}]) 

Nếu bạn không muốn form_id sẽ được hiển thị, chỉ cần không chỉ định form_id trong phần dự án của truy vấn. Theo mặc định, mongo sẽ chỉ hiển thị các khóa có giá trị là 1. Nếu khóa không được đề cập, nó sẽ không hiển thị.

db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Function":1}}]) 
+0

Tôi đã thử câu trả lời của bạn trong db của tôi, nhận được tổng hợp lỗi kiểu không phải là một trình bao hàm. – siva

+0

Phiên bản nào của Mongo bạn có, bởi vì tôi đã thử tất cả các truy vấn trước khi đăng câu trả lời và nó hoạt động. Tập hợp được hỗ trợ từ mongo 2.1 trở đi [link] (http://docs.mongodb.org/manual/applications/aggregation/#overview) – ann

+0

Tôi đang sử dụng phiên bản mongodb win32-i386-2.0.7, Vì vậy, chức năng cố gắng không thể đạt được trong phiên bản này, Có cách nào để làm điều này trong phiên bản này. – siva

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