2017-01-17 50 views
6

Chcę dodać kolekcje dołączyć przy użyciu $lookup w mongodb. Staram jak poniżej

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

Teraz mam dwa zbiory

użytkownika zawiera objectid użytkowników jak "_id" : ObjectId("56ab6663d69d2d1100c074db"),

i Zadania gdy zawiera assignedId jako string"assignedId":"56ab6663d69d2d1100c074db"

Teraz, gdy aplikuję $ lookup w obu kolekcjach nie działa, ponieważ identyfikatory Id nie pasują.

Do tego google go i znaleźć rozwiązanie, które włączenia

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

ale to rozwiązanie nie działa dla mnie, Jego rzucanie błąd:

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

Proszę mi jak pomóc czy mogę rozwiązać ten problem.

Dzięki

+0

Możliwy duplikat pola [Mongodb Join on \ _id od String do ObjectId] (https://stackoverflow.com/questions/41093647/mongodb-join-on-id-field-from-string-to-objectid) – felix

Odpowiedz

2

Nie jest to możliwe w potoku agregacji. Nie ma metody konwersji typu. Czy można zmienić typ "assignId" w kolekcji Tasks na ObjectId? Innym trzeba to zrobić w kodzie, przekonwertować ObjectId na ciąg i użyć w innym zapytaniu.

+1

OK ..... załóżmy, że w kolekcji zadań robię '" assignId ": ObjectId (" 56ab6663d69d2d1100c074db ")' i teraz chcę uzyskać zadania na podstawie assignId, a następnie jak mogę napisać zapytanie dla tego ... 'Task. find ({assignId: ObjectId ("56ab6663d69d2d1100c074db")}, function (err, data) {....}) ' –

+1

Po zapętleniu wyników możesz zrobić" toString() "na właściwości, aby przekonwertować ObjectId = > String, dzięki czemu można go użyć w następnym wyszukiwaniu. jak: Task.find ({assignId: yourvar.toString()}, function (err, data) {....}) – HoefMeistert

+1

Mam na myśli, mam ownerId like '56ab6663d69d2d1100c07 4db', a teraz chcę pobrać dane z 'tasks' collection' Task.find ({assignId: ownerId}, function (err, data) {....}) 'ale w zbiorze zadań mam' assignId' jak 'ObjectId (" 56ab6663d69d2d1100c07 4db ")' then jak to będzie działać? jak to będzie pasować do id's –