2010-07-08 31 views
8

Trong MongoDB, sử dụng $type, có thể lọc tìm kiếm dựa trên trường phù hợp với loại dữ liệu BSON (xem DOCS).Trả về loại thực tế của một trường trong MongoDB

Ví dụ:

db.posts.find({date2: {$type: 9}}, {date2: 1}) 

trả về:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "date2" : "Fri Jul 09 2010 08:25:26 GMT" 
} 

Tôi cần một truy vấn mà sẽ cho tôi biết những gì các loại thực tế của lĩnh vực này là, đối với mọi lĩnh vực trong một bộ sưu tập. Điều này có thể xảy ra với MongoDB không?

Trả lời

6

OK, đây là một số câu hỏi liên quan có thể giúp:

Get all field names trong một bộ sưu tập sử dụng bản đồ-giảm.

Đây là a recursive version liệt kê tất cả các trường có thể.

Hy vọng rằng điều đó có thể giúp bạn bắt đầu. Tuy nhiên, tôi nghi ngờ rằng bạn sẽ gặp phải một số vấn đề với yêu cầu này. Có hai vấn đề ở đây:

  1. Tôi không thể tìm thấy hàm "gettype" cho JSON. Bạn có thể truy vấn bằng $type, nhưng có vẻ như bạn thực sự có thể chạy chức năng gettype trên một trường và có bản đồ đó quay trở lại loại BSON.
  2. Một trường có thể chứa dữ liệu của nhiều loại, vì vậy bạn sẽ cần một kế hoạch để xử lý việc này. Ngay cả khi nó không rõ ràng Mongo có thể lưu trữ một số con số như ints và những người khác nổi mà không có bạn thực sự biết. Trong thực tế, với trình điều khiển PHP, điều này là hoàn toàn có thể.

Vì vậy, nếu bạn cho rằng bạn có thể giải quyết vấn đề # 1, sau đó bạn sẽ có thể giải quyết vấn đề # 2 bằng sự thay đổi nhỏ trên "Nhận tất cả Tên trường".

Nó có lẽ sẽ giống như thế này:

"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } } 
"reduce" : function(key, stuff) { return (key, add_to_set(stuff)); } 

Vì vậy, về cơ bản bạn sẽ phát ra các keytype of key value (như là một mảng) trong hàm bản đồ. Sau đó, từ chức năng giảm, bạn sẽ thêm các mục nhập duy nhất cho từng loại.

Vào cuối thời gian bạn sẽ có dữ liệu như thế này

{"_id":[255], "name" : [1,5,8], ... }

Tất nhiên, đây là tất cả rất nhiều công việc, tùy thuộc vào vấn đề thực tế của bạn, bạn có thể chỉ muốn đảm bảo (từ mã của bạn) rằng bạn luôn đặt đúng loại dữ liệu. Việc tìm kiếm loại dữ liệu sau khi dữ liệu nằm trong DB chắc chắn là một nỗi đau.

6

loại truy vấn dưới đây trong Mongo shell

typeof db.employee.findOne().first_name 

Cú pháp

typeof db.collection_name.findOne().field_name 
+1

này sẽ cung cấp cho các loại JS, mà có thể khác với các loại BSON. Ví dụ, nếu bạn gõ typeof db.employee.findOne() ._ id, bạn sẽ nhận được "string", nhưng kiểu BSON là "Object id." –

0

Ghi nhận rằng a=5;a.constructor.toString() in function Number() { [native code] }, người ta có thể làm điều gì đó tương tự như:

db.collection.mapReduce(function() { emit(this._id.constructor.toString().replace(/^function (\S+).+$/, "$1"), 1); }, function(k, v) { return Array.sum(v); }, { out: { inline: 1 } });

6

Bắt đầu từ MongoDB 3.4, bạn c sử dụng toán tử tổng hợp $type để trả về loại của trường.

db.posts.aggregate( 
    [ 
     { "$project": { "fieldType": { "$type": "$date2" } } } 
    ] 
) 

trong đó sản lượng:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
} 
Các vấn đề liên quan