2016-03-17 14 views
13

Có toán tử nào tôi có thể sử dụng trong hàm tổng hợp để nhận chuỗi thay vì ObjectId trả lời không?

db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}]) 
+2

Không không có. Khung tổng hợp không tái diễn bất kỳ loại dữ liệu nào (ngoại trừ chuỗi từ số qua '$ substr' và số sang Date hoặc Date thành số là về cơ bản có thể với trickery). Tại sao bạn nghĩ điều này là cần thiết? Khá đơn giản trong hầu hết các ngôn ngữ để viết giá trị 'ObjectId' thành chuỗi. –

+1

@BlakesSeven Luôn luôn có lý do tại sao :) Vì sự đơn giản. Tất nhiên bạn có thể đăng quá trình đó. Nhưng sẽ rất tuyệt nếu tôi chỉ có thể chuyển kết quả cho dịch vụ/bên khác yêu cầu chuỗi đơn giản. ... – matus

+1

Cũng giống như tôi đã nói, với hầu hết các ngôn ngữ, BSON chỉ được truyền tới các loại địa phương. Và đối với các ngôn ngữ "hầu hết", không có công việc nào được yêu cầu để chỉ xuất ra dưới dạng một chuỗi. Cá nhân tôi thích dạng đầu ra JSON mở rộng tức là '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}' vì ít nhất cho phép máy khách từ xa biết rằng dữ liệu thực sự là một 'ObjectId' để nó có thể phân tích cú pháp và truyền chính xác. Đó là một điều tốt, đặc biệt là xem xét rằng lưu trữ là ** một nửa số byte của độ dài chuỗi. –

Trả lời

6

Không có Toán tử trực tiếp nào trong hàm tổng hợp để nhận chuỗi từ ObjectId.

Sau phiên bản 2.6 Bạn có thể sử dụng phương pháp ObjectId.toString() để chuyển đổi ObjectId thành chuỗi. Trước tiên, bạn khớp và dự án ObjectID của bạn. Sau đó, bạn có thể chuyển đổi ID đối tượng này thành chuỗi bằng cách sử dụng ObjectID.toString().

db.something.aggregate([{"$match":{'property': {$exists:true}}},{"$project":{"_id":1}}]) 

Và sau đó sử dụng kết quả Object và nhận được chuỗi như phản ứng sử dụng ObjectID.tostring()

Chỉnh sửa: Bạn có thể truy cập vào thuộc tính str của đối tượng id sử dụng

ObjectId("507f191e810c19729de860ea").str

nguồn: mongodb docs

-11

Bạn có thể làm điều đó inline sử dụng toán tử $concat:

db.something.aggregate(
    [ 
     { $match : 
      { 'property' : 
       { $exists:true } 
      } 
     }, 
     { $project: 
      { stringId: 
       { $concat: [ ObjectId().str ] } 
      } 
     } 
    ] 
) 
+0

Đối với tôi, điều này không làm cho "stringId" đối tượng của bản ghi. Nó làm cho nó trở thành một phiên bản được xâu chuỗi của một ObjectId hoàn toàn mới. Đặc biệt, nó có cùng giá trị cho tất cả các tài liệu được trả về. Vì vậy, tôi không nghĩ rằng điều này là đúng. – mcdave

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