2017-10-29 1 views
0

Ich habe eine Sammlung mit folgenden Struktur:Wie schließe ich ein einzelnes Objekt aus einem Array in mongodb aus?

{ 
     "_id" : ObjectId("59ef54445134d7d70e1cf531"), 
     "CustomerId" : "Gym_2", 
     "History" : [ 
       { 
         "Created_At" : ISODate("2017-10-24T14:54:59Z"), 
         "Unit" : 600, 
         "ReferenceCode" : "1cd15b4d-bc42-4a51-a8b3-307db6dc3dee", 

       }, 
       { 
         "Created_At" : ISODate("2017-10-28T00:22:19Z"), 
         "Sent" : true 
       }, 
       { 
         "Created_At" : ISODate("2017-10-29T10:22:23Z"), 
         "Unit" : 600, 
         "ReferenceCode" : "998e7fce-8a1c-4f7c-b48c-c02cb5c5ad5c", 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("59ef54465134d7d70e1cf534"), 
     "CustomerId" : "Gym_1", 
     "History" : [ 
       { 
         "Created_At" : ISODate("2017-10-24T14:55:02Z"), 
         "Unit" : 600, 
         "ReferenceCode" : "d19ebeec-bd81-4a0a-aed5-006f746b50ff", 
       }, 
       { 
         "Unit" : 600, 
         "ReferenceCode" : "a991504f-be1f-4e77-b59f-fba73c59e6f1", 
         "Created_At" : ISODate("2017-10-26T13:51:14Z") 
       } 
     ] 
} 

Ich versuche, eine Abfrage zu erstellen, die nur CustomerId zusammen mit Geschichte Objekten zurückgibt, die den "Sent" Feldsatz nicht hat. Das Ergebnis sollte wie folgt aussehen:

 { 
       "_id" : ObjectId("59ef54445134d7d70e1cf531"), 
       "CustomerId" : "Gym_2", 
       "History" : [ 
         { 
           "Created_At" : ISODate("2017-10-24T14:54:59Z"), 
           "Unit" : 600, 
           "ReferenceCode" : "1cd15b4d-bc42-4a51-a8b3-307db6dc3dee", 

         }, 

    { 
          "Created_At" : ISODate("2017-10-29T10:22:23Z"), 
          "Unit" : 600, 
          "ReferenceCode" : "998e7fce-8a1c-4f7c-b48c-c02cb5c5ad5c", 
        } 
      ] 
    } 
    { 
      "_id" : ObjectId("59ef54465134d7d70e1cf534"), 
      "CustomerId" : "Gym_1", 
      "History" : [ 
        { 
          "Created_At" : ISODate("2017-10-24T14:55:02Z"), 
          "Unit" : 600, 
          "ReferenceCode" : "d19ebeec-bd81-4a0a-aed5-006f746b50ff", 
        }, 
        { 
          "Unit" : 600, 
          "ReferenceCode" : "a991504f-be1f-4e77-b59f-fba73c59e6f1", 
          "Created_At" : ISODate("2017-10-26T13:51:14Z") 
        } 
      ] 
    } 

Die nächstgelegene ich erreichen könnte, ist die folgende Abfrage:

db.Customers.aggregate([ 
    {$project:{"Sent":{$exists:false},count:{$size:"$History" }}} 
    ]); 

Aber ich "errmsg" : "Unrecognized expression '$exists'" bekommen. Wie erreiche ich dieses Ergebnis?

+0

'db.Customers.aggregate ([{" $ addFields ": {" Verlauf ": {" $ filter ": {" input ":" $ Verlauf "," as ":" h "," cond ": {"$ ne": ["$$ h.Sent", wahr]}}}}}]) ' –

Antwort

1

Es gibt eine Lösung für Ihr Problem, und Aggregation Framework ist definitiv der richtige Weg, um das zu erreichen, was Sie wollen. Um verschachtelte Sammlung ändern müssen Sie:

  1. Unwind diese Sammlung ($ Abwickler)
  2. Dokumente filtern, wo Sent
  3. Gruppe besteht durch gemeinsame Eigenschaften
  4. Projizieren Sie Ihre Daten erhalten sie Urform ist

    db.customers.aggregate([ 
        {$unwind: "$History"}, 
        {$match: {"History.Sent": {$exists: false}}}, 
        {$group: {"_id": { "_id": "$_id", "CustomerId": "$CustomerId" }, History: { $push: "$History"} }}, 
        {$project: { "_id": "$_id._id", "CustomerId": "$_id.CustomerId", History: 1}} 
    ]); 
    

Wie Sie diese Abfrage sehen kann, ist eher complicat Bei größeren Sammlungen können Probleme mit der Leistung auftreten, da wir viel mehr tun als nur die einfache Filterung von Sammlungen. Und obwohl es funktioniert würde ich vorschlagen, die Sie berücksichtigen sollten Ihr Datenmodell zu ändern, zum Beispiel jede Geschichte Element mit als separates Dokument wie folgt aus:

{ 
    _id: "some_id" 
    "Created_At" : ISODate("2017-10-24T14:54:59Z"), 
    "CustomerId" : "Gym_2", 
    "Unit" : 600, 
    "Sent" : true //can be set or not 
    "ReferenceCode" : "1cd15b4d-bc42-4a51-a8b3-307db6dc3dee" 
} 

dann Ihre Abfrage nur einfach finden sein wird mit $ existiert.

Verwandte Themen