2017-07-14 1 views
1

Ich möchte Daten nach $ Lookup-Aggregation filtern.

Jetzt möchte ich den einzigen Wert des Standortschlüssels aus der untergeordneten Auflistung, nicht das gesamte Dokument. Auch wenn ich den spezifischen Schlüssel in der Position brauche, d. H. Zone_id Was soll ich tun? Bitte helfen Sie.

ich unten Abfrage bin mit

// Abfrage

db.parent.aggregate([ 
     { 
      $lookup: 
     { 
      from: "child", 
      localField: "pid", 
      foreignField: "pid", 
      as: "more" 
     } 
     } 
]) 

// Daten // Kinder Sammlung

db.child.insert({ 
    "pid": 1, 
    "name": "Max", 
    "title": "Top" 
    "status": 1, 

    "description": { 
    "destination": "jur bagh", 
    "community": "abc" 
    }, 
    "location:": { 
    "zone_id": "north", 
    "city": "jaipur", 
    "latitude": "12.121212", 
    "longitude": "21.414134" 
    }, 
    "created_by": "user_id", 
    "modified_by": "user", 
    "created_at": "12:00", 
    "updated_at": "13:00" 
}); 

// Mutter Sammlung

db.parent.insert({ 
    "pid": 1, 
    "pname": "PQW", 
    "rox": "Labs", 
    "status": 1, 
    "created_by": "smdcd", 
    "modified_by": "pink", 
    "created_at": "12:00", 
    "updated_at": "13:00" 
}); 

ich führen möchte wie diese

db.parent.insert({ 
    "pid": 1, 
    "pname": "PQW", 
    "rox": "Labs", 
    "status": 1, 
    "created_by": "smdcd", 
    "modified_by": "pink", 
    "created_at": "12:00", 
    "updated_at": "13:00" 
"more" [ 
"location:": { 
    "zone_id": "north", 
    "city": "jaipur", 
    "latitude": "12.121212", 
    "longitude": "21.414134" 
    } 
] 


}); 
+0

Hinweis gibt es, was einen „Tippfehler“ in Ihren Kind Sammlungsdaten zu sein scheint. Das Feld heißt "location:" ', das einen Doppelpunkt': am Ende des Namens enthält. Es ist nicht klar, ob dies nur ein Fehler in der Frage ist oder ob Ihre tatsächlichen Daten diesen Fehler enthalten. Daher wird der "Fehler" als Antwort betrachtet. –

Antwort

0

Sie wollen $arrayElemAt hier das „single“ Ergebnis aus den $lookup verweisen und platzieren Sie Ihr neues Feld in dem Dokument mit $addFields sofern verfügbar, oder sonst $project mit allen Feldern:

db.parent.aggregate([ 
    { "$lookup": { 
    "from": "child", 
    "localField": "pid", 
    "foreignField": "pid", 
    "as": "location" 
    }}, 
    { "$addFields": { 
     "location": { "$arrayElemAt": [ "$location.location:", 0 ] } 
    }} 
]) 

Beachten Sie auch, dass Sie einen Tippfehler in Ihrem Feldnamen im Kind haben, da es heißt: "location:" mit dem Doppelpunkt : am Ende. Oder vielleicht ist das nur ein Fehler in der Frage.

Produziert:

{ 
    "_id" : ObjectId("5968821f7dcd6a5f6a9b4b7d"), 
    "pid" : 1.0, 
    "pname" : "PQW", 
    "rox" : "Labs", 
    "status" : 1.0, 
    "created_by" : "smdcd", 
    "modified_by" : "pink", 
    "created_at" : "12:00", 
    "updated_at" : "13:00", 
    "location" : { 
     "zone_id" : "north", 
     "city" : "jaipur", 
     "latitude" : "12.121212", 
     "longitude" : "21.414134" 
    } 
} 

Basierend auf den Daten, wie in Ihrer Frage zur Verfügung gestellt.

Alternativ Prozess mit $map, wenn Sie mehrere Ergebnisse beabsichtigt:

db.parent.aggregate([ 
    { "$lookup": { 
    "from": "child", 
    "localField": "pid", 
    "foreignField": "pid", 
    "as": "more" 
    }}, 
    { "$addFields": { 
    "more": { 
     "$map": { 
     "input": "$more.location:", 
     "as": "l", 
     "in": { "location": "$$l" } 
     } 
    } 
    }} 
]) 

Mit Ergebnissen wie:

{ 
    "_id" : ObjectId("5968821f7dcd6a5f6a9b4b7d"), 
    "pid" : 1.0, 
    "pname" : "PQW", 
    "rox" : "Labs", 
    "status" : 1.0, 
    "created_by" : "smdcd", 
    "modified_by" : "pink", 
    "created_at" : "12:00", 
    "updated_at" : "13:00", 
    "more" : [ 
     { 
      "location" : { 
       "zone_id" : "north", 
       "city" : "jaipur", 
       "latitude" : "12.121212", 
       "longitude" : "21.414134" 
      } 
     } 
    ] 
} 
+0

Bitte beachten Sie, dass $ addFields nur von MongoDB v3.4 verfügbar ist. –

+1

@PavK. Ziemlich gut bewusst, weshalb ich sagte "wo verfügbar". Es macht sowieso keinen Unterschied und ist lediglich der Unterschied zwischen der Aufzählung von "allen" Feldern mit einer "1", um sie über "$ project" oder "$ addFields" einzufügen. Die Grundlagen der Antwort sind von Version zu Version unverändert. Sie brauchen zumindest MongoDB 3.2 für '$ lookup', und 3.4 ist nicht gerade eine 'neue Version'. –

+0

@NeilLunn wenn ich Mongo in ubuntu Typ zeigt es MongoDB Shell-Version v3.4.6 Anschluss an: mongodb: //127.0.0.1: 27017 MongoDB-Server-Version: 3.2.15 ACHTUNG: Shell und Server-Versionen nicht übereinstimmen was immer noch $ addfields nicht erkennt – Creator

0

Verwenden $ Projekt https://docs.mongodb.com/manual/reference/operator/aggregation/project/

,{$project:{ 
    pid:1, 
    pname:1, 
    rox:1, 
    status:1, 
    modified_by:1, 
    created_by:1, 
    created_at:1, 
    updated_at:1, 
    more.location:$more.location 
}} 
// 'name of the field':1 means you want to keep the 'name'. 
// more.location:$more.location means you passing down the data you need. 

Um die Ergebnisse zu filtern nach unten Sie $ passen in Ihr Aggregat https://docs.mongodb.com/manual/reference/operator/aggregation/match/

,{$match:{ 
    more.location.zone_id:'north' 
}} 

wenn hinzufügen Sie haben mehrere Standorte als Array, möchten aber nur einen zurückgeben, Sie könnten wa nt bis $ entspannen Array zuerst:

,{$unwind:'$more.location'} 
+0

Es gibt mir Fehler: SyntaxError: fehlende: nach Eigenschaft ID @ (Shell) db.parent.Aggregat ([ { $ Lookup: { aus: "Kind", localField: "pid", foreignField: "pid", als: "mehr" } }, {$ Projekt: { pid: 1, pname: 1, rox: 1, Status: 1, MODIFIED_BY: 1, created_by: 1, created_at: 1, updated_at: 1, more.location: $ more.location }} ]) – Creator

Verwandte Themen