2013-03-11 16 views
11

Giả sử tôi có một phiên bản MongoDB với 2 bộ sưu tập - địa điểmmọi người.Làm cách nào để xác thực DBRef trong bộ sưu tập MongoDB?

Một điển hình nơi tài liệu trông giống như:

{ 
    "_id": "someID" 
    "name": "Broadway Center" 
    "url": "bc.example.net" 
} 

Và một người tài liệu trông giống như:

{ 
    "name": "Erin" 
    "place": DBRef("places", "someID") 
    "url": "bc.example.net/Erin" 
} 

Có cách nào để xác nhận nơi DBRef của mỗi Tài liệu trong số người bộ sưu tập?

+0

Chỉ bằng cách thủ công chọn ra các tài liệu và truy vấn cho sự tồn tại các bộ sưu tập tài liệu tiếp theo. – Sammaye

+3

Hơi off-topic nhưng chắc chắn rằng bạn cần DBRef hơn là chỉ đơn giản là lưu trữ một ID tài liệu. DBRef chỉ là một lựa chọn tốt nếu bạn không chắc chắn trong đó cơ sở dữ liệu lôgic tài liệu nào đang được nhắc tới. Cả hai tùy chọn đều yêu cầu truy vấn thủ công đối với tài liệu được giới thiệu (mặc dù một số thư viện cấp cao hơn sẽ làm điều đó cho bạn). –

+0

Cảm ơn mẹo; DBRef được yêu cầu thực tế. – noamt

Trả lời

10

không có phương thức chính thức/tích hợp để kiểm tra tính hợp lệ của DBRef, do đó việc xác thực phải được thực hiện thủ công.

Tôi đã viết một kịch bản nhỏ - validateDBRefs.js:

var returnIdFunc = function(doc) { return doc._id; }; 

var allPlaceIds = db.places.find({}, {_id: 1}).map(returnIdFunc); 

var peopleWithInvalidRefs = db.people.find({"place.$id": {$nin: allPlaceIds}}).map(returnIdFunc); 

print("Found the following documents with invalid DBRefs"); 
var length = peopleWithInvalidRefs.length; 
for (var i = 0; i < length; i++) { 
    print(peopleWithInvalidRefs[i]); 
} 


đó khi chạy với:

Mongo db_name validateDBRefs.js


Will đầu ra:

Tìm thấy các tài liệu sau với DBRefs không hợp lệ

513c4c25589446268f62f487

513c4c26589446268f62f48a

1

bạn có thể thêm chức năng được lưu trữ cho điều đó. xin lưu ý rằng tài liệu mongo không khuyến khích sử dụng các chức năng được lưu trữ. Bạn có thể đọc về nó here

Về bản chất bạn tạo một hàm:

db.system.js.save(
    { 
    _id : "myAddFunction" , 
    value : function (x, y){ return x + y; } 
    } 
); 

và một khi chức năng được tạo ra, bạn có thể sử dụng nó trong nơi khoản của bạn. Vì vậy, bạn có thể viết một hàm để kiểm tra sự tồn tại của id trong dbRef.

+0

Cảm ơn bạn đã đề xuất. Bởi vì nó là một hoạt động mà sẽ không được thực hiện rất thường xuyên, tôi sẽ chỉ viết một kịch bản và tự đánh giá nó. – noamt

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