2017-01-17 13 views
6

Tôi muốn thêm các bộ sưu tập tham gia bằng cách sử dụng $lookup trong mongodb. Tôi đang cố gắng như sau

{ 
$lookup:{ 
    from:"User", 
    localField:"assignedId", 
    foreignField:"_id", 
    as:"dataa"} 
} 

Bây giờ tôi có hai bộ sưu tập

tài chứa objectid của người sử dụng như "_id" : ObjectId("56ab6663d69d2d1100c074db"),

Nhiệm vụ nơi nó chứa assignedId như một string"assignedId":"56ab6663d69d2d1100c074db"

Bây giờ, khi áp dụng tra cứu $ trong cả hai bộ sưu tập nó không hoạt động vì Id không khớp.

Cho rằng tôi googled nó và tìm thấy một giải pháp mà để bao gồm

{ $project: { assignedId: {$toObjectId: "$assignedId"} }}

nhưng giải pháp này không làm việc cho tôi, nó ném một lỗi:

assert: command failed: { "ok" : 0, "errmsg" : "invalid operator '$toObjectId'", "code" : 15999 } : aggregate failed 

Xin hãy giúp tôi làm thế nào tôi có thể giải quyết vấn đề này không.

Cảm ơn

+0

Có thể trùng lặp của trường [Mongodb Tham gia trên \ _id từ chuỗi thành ObjectId] (https://stackoverflow.com/questions/41093647/mongodb-join-on-id-field-from-string-to-objectid) – felix

Trả lời

2

Không thể thực hiện trong đường ống tổng hợp. Không có phương pháp để chuyển đổi loại. Bạn có thể thay đổi loại "assignedId" trong bộ sưu tập Tasks thành ObjectId không? Khác bạn phải làm điều đó trong mã, chuyển đổi ObjectId thành một String và sử dụng trong truy vấn khác.

+1

OK ..... giả sử trong bộ sưu tập nhiệm vụ tôi làm '" assignedId ": ObjectId (" 56ab6663d69d2d1100c074db ")' và bây giờ tôi muốn nhận nhiệm vụ trên cơ sở của assignId sau đó làm thế nào tôi có thể viết truy vấn cho rằng ... 'Task. find ({assignedId: ObjectId ("56ab6663d69d2d1100c074db")}, hàm (err, data) {....}) ' –

+1

Khi bạn lặp qua các kết quả, bạn có thể thực hiện" toString() "trên thuộc tính để chuyển đổi ObjectId = > String để bạn có thể sử dụng nó trong lần tìm tiếp theo. như: Task.find ({assignId: yourvar.toString()}, hàm (err, data) {....}) – HoefMeistert

+1

Ý tôi là, tôi có ownerId như '56ab6663d69d2d1100c07‌ 4db' và bây giờ tôi muốn lấy dữ liệu từ 'task' collection' Task.find ({assignId: ownerId}, hàm (err, data) {....}) 'nhưng trong collection tasks, tôi có' assignedId' như 'ObjectId (" 56ab6663d69d2d1100c07‌ 4db ")' then nó sẽ hoạt động như thế nào? làm thế nào để nó sẽ phù hợp với id của –

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