2014-12-19 15 views
10

Tôi đang cố gắng chuyển đổi chuỗi thập lục phân sang đối tượng tương đương của nó trong truy vấn tổng hợp. Tôi đã thử hai phương pháp khác nhau:Chuỗi dự án tập hợp MongoDB đến ObjectId

db.omvas.aggregate([ 
    {$project:{ 
     EID:{$let: { 
       vars: { 
        id: "$EID" 
       }, 
       in: ObjectId("$$id") 
      }}, 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

db.omvas.aggregate([ 
    {$project:{ 
     EID: ObjectId("$EID") 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

tôi tiếp tục nhận được lỗi "Lỗi: không hợp lệ đối tượng id: chiều dài" sử dụng một trong hai phương pháp. Tôi đã thử nghiệm thêm một chuỗi chữ ở vị trí của biến tập hợp và tôi nhận được kết quả với một ObjectID thích hợp. Dường như giá trị chuỗi không được chuyển qua hàm ObjectId của Mongo mà đúng hơn là tên biến được truyền như một chuỗi ký tự.

Bất cứ ai cũng có bất kỳ ý tưởng nào nếu những gì tôi đang cố gắng hoàn thành là có thể? Có một số phép thuật tôi đang thiếu?

Trả lời

3

ObjectId là hàm tạo cho ObjectIds trong trình bao. Khi bạn viết một cái gì đó như

"EID" : { "$let" : { 
      "vars" : { "id" : "$EID" }, 
      "in" : ObjectId("$$id") 
     } } 

vỏ mongo đánh giá ObjectId("$$id") trước khi gửi yêu cầu tổng hợp. Giống như khi bạn gọi một hàm trong Javascript như

var x = 2 
var y = 4 
f(x + y) // f(6) 

Điều bạn cần là toán tử tổng hợp để chuyển đổi chuỗi thành ObjectId. Thật không may, không có chức năng như vậy tồn tại, như của MongoDB 2.6. Tại sao bạn cần phải chuyển đổi chuỗi? bạn sẽ làm gì với nó? Có lẽ có một cách xung quanh việc thiếu một toán tử chuyển đổi trong tập hợp.

+0

Cảm ơn, điều đó có ý nghĩa hoàn hảo. Truy vấn cụ thể này chỉ là một giai đoạn trong luồng công việc báo cáo. ObjectId là cần thiết vì nó đang được sử dụng bởi các truy vấn xa hơn đường ống. Tôi đang suy nghĩ lại cách họ làm việc ngay bây giờ và nghĩ rằng tôi có một cách tốt hơn để thực hiện chúng. – StevenWarren

+1

Trong trường hợp của tôi, tôi muốn thực hiện '$ lookup' trong đó trường cục bộ là biểu diễn chuỗi của' ObjectId' và trường ngoài là một 'ObjectId' thực tế. Bất kỳ ý tưởng nếu điều này là có thể w/MongoDB 3.2? – Madbreaks

+1

Một cách xung quanh nó sẽ là viết một kịch bản cho biết thêm một lĩnh vực mới có chứa các id như là một ObjectId cho các tài liệu trong bộ sưu tập. Sau đó, thực hiện tra cứu $ bằng cách sử dụng trường mới. –

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