Mongodb Join " _id " - Feld von String ObjectId
Habe ich zwei Sammlungen
-
Benutzer
{ "_id" : ObjectId("584aac38686860d502929b8b"), "name" : "John" }
-
Rolle
{ "_id" : ObjectId("584aaca6686860d502929b8d"), "role" : "Admin", "userId" : "584aac38686860d502929b8b" }
Ich joinen will diese Sammlung basiert auf der userId (in Rolle Sammlung) - _id ( in Benutzer Sammlung).
Ich habe versucht, die unter-Abfrage:
db.role.aggregate(
{
$lookup:
{
from: 'user',
localField: 'userId',
foreignField: '_id',
as: 'output'
}
}
);
Dies gibt mir die erwarteten Ergebnisse, solange ich die speichern die Benutzer-id eine ObjectId. Wenn meine Benutzer id ist eine Zeichenfolge, gibt es keine Ergebnisse.
Ps: ich habe versucht,
foreignField: '_id'.valueOf()
und
foreignField: '_id'.toString()
. Aber kein Glück zu Spiel/join basiert auf einem ObjectId-string-Felder.
Jede Hilfe wird geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht möglich, da der MongoDB 3.4. Dieses feature wurde bereits angefordert, aber noch nicht umgesetzt noch nicht. Hier sind die entsprechenden tickets:
string
ISODates ObjectID
Für jetzt haben Sie, um zu speichern die Benutzer-id ObjectId
BEARBEITEN
Den bisherigen Karten wurden behoben, MongoDB 4.0. Jetzt können Sie erreichen dies mit der folgenden Abfrage:
Ergebnis:
online testen: mongoplayground.net/p/JoLPVIb1OLS
Können Sie
$toObjectId
aggregation von mongodb 4.0 wandelt Stringid
zuObjectId
Oder verwenden Sie
$toString
aggregation von mongodb 4.0 wandeltObjectId
zuString
$addFields
fügt ein neues Feld, um die zurückgegebenen Dokumente.Ich denke, die Vorherige Antwort hat sich ein Fehler auf die '$toObjectId' Fall. Die
let
Anweisung gilt für die db-Sammlung auf, die die Funktionaggregate
genannt wird (ich.e 'Rolle') und nicht auf die Sammlung hingewiesen, die von "aus" (hab.e 'user').Oder
Und