2016-06-20 18 views
1

Ich habe eine mongodb-Aggregationspipeline mit einer $ -Projektstufe, und ich möchte bestimmte Felder nur dann einfügen, wenn die Bedingungen erfüllt sind. Insbesondere möchte ich die _id in einer Bedingung ausschließen und ein zweites Feld 'second_id' in die andere Bedingung aufnehmen.Bedingt ein Feld (_id oder andere) in mongodb Projekt-Aggregation enthalten?

Ich weiß, dass es (noch) nicht möglich ist, Felder aus einem mongodb $ -Projekt auszuschließen, aber ist es möglich, sie bedingt einzuschließen?

Gibt es eine Möglichkeit, das _id-Feld bedingt auszuschließen? Es akzeptiert eine 0 oder 1, aber was, wenn ich das 0 oder 1 basierend auf einer if-Anweisung bestimmen möchte. Wie würde das gemacht werden?

Pseudocode für _id:

$project: { _id: { $ifNull: [ "$user_id", 0 ] } } 

Die hauptsächliche Verwendung hierfür wäre die doc.user_id als Ergebnis _id zu verwenden, oder erlauben mongodb eine neue autoincrement _id zu erstellen, wenn das user_id null ist.

Antwort

0

Momentan gibt es keine Möglichkeit, dies innerhalb der $ -Projektstufe zu tun, aber Sie können die $ redact-Stufe verwenden, um das Feld bedingt zu entfernen (dh Sie setzen den Wert auf 0, wie Sie es in Ihrem Beispiel tun.

db.collection.aggregate(
    ... matching and stuff ... 
    {$project: { _id: { $ifNull: [ "$user_id", 0 ] } }}, 
    {$redact: { 
    {$cond: { 
    if: { $eq: [ "$user_id", 0 ] }, 
    then: '$$PRUNE', 
    else: '$$DESCEND' 
    }} 
}