Entfernen Sie alle Felder, die null sind
Wie kann ich entfernen Sie alle Felder, die null
aus alle Dokumente eines bestimmten Kollektion?
Habe ich eine Sammlung von Dokumenten, wie:
{
'property1': 'value1',
'property2': 'value2',
...
}
aber jedes Dokument kann eine null
Eintrag, anstatt einen Wert-Eintrag.
Möchte ich Speicherplatz sparen, indem Sie alle null
Einträge. Die Existenz der null
Einträge nicht alle Informationen enthalten, die in meinem Fall, weil ich weiß, das format der JSON-Dokument a priori.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine wichtige Frage, da mongodb keine index null-Werte (d.h. keine Abfrage für null-Werte oder werden Sie warten, für eine lange Zeit), so ist es am besten gänzlich vermeiden Sie null-und set default-Werte mit
setOnInsert
.Hier ist eine rekursive Lösung entfernen von null-Werten:
Dokument vor:
Dokument nach:
Wie Sie sehen können, es entfernt
null
,undefined
leere Objekte und leere arrays. Wenn Sie es brauchen, um mehr/weniger aggressiv, es ist eine Frage der änderung der block "NULL-FELDER - ÄNDERN Sie DIESEN BLOCK ZUM HINZUFÜGEN von EINSCHRÄNKUNGEN".änderungen willkommen, vor allem von @stennie
Wie diese Frage erwähnt (mongodb-query ohne Feldnamen):
So, können Sie entweder Durchlaufen Sie das Dokument (wie Wizard ' s Beispiel), oder tun Sie es in nicht-mongodb Weg.
Ist dies eine JSON-Datei, entfernen Sie alle Zeilen mit
null
im sed-vielleicht funktioniert:Können Sie die mongo updateMany Funktionalität, aber Sie müssen dies tun, durch die Angabe des Parameters, den Sie gehen, um zu aktualisieren, wie die
year
parameter:Ab
Mongo 4.2
,db.Sammlung.update()
können akzeptieren eine aggregation pipeline, schließlich ermöglicht das entfernen eines Felds basierend auf den Wert:Details:
Den ersten Teil
{}
ist das Spiel-Abfrage, Filterung, welche Dokumente zu aktualisieren (in unserem Fall alle Dokumente).Den zweiten Teil
[{ $replaceWith: { ... }]
ist das update aggregation pipeline (beachten Sie die eckigen Klammern bedeuten, die Verwendung einer aggregation pipeline):$objectToArray
wir zunächst die Transformation des Dokuments in ein array von Schlüssel/Werte-wie[{ k: "property1", v: "value1" }, { k: "property2", v: null }, ...]
.$filter
, wir filtern dieses array von Schlüssel/Werte-durch das entfernen von Elementen, für diev
istnull
.$arrayToObject
.$replaceWith
.Vergessen Sie nicht
{ multi: true }
, andernfalls wird nur das erste übereinstimmende Dokument aktualisiert werden.