2017-10-24 4 views
1

Ich frage mich, wie ich Arrays von (verschachtelten) Objekte in Mongoose vergleichen kann.Abfrage Vergleichen von Arrays von Objekten

In Anbetracht der Daten unten, möchte ich Ergebnisse erhalten, wenn die name Eigenschaften übereinstimmen. Könnte mir jemand dabei helfen?

Organisation.find({ 
     $or: [ 
      { "category_list": { $in: cat_list } }, 
      { "place_topics.data": { $in: place_tops } } 
     ] 
     } 
    ) 

Lassen Sie uns sagen, dass dies die in meinem MongoDB gespeicherten Daten:

"category_list": [ 
     { 
      "id": "197750126917541", 
      "name": "Pool & Billiard Hall" 
     }, 
     { 
      "id": "197871390225897", 
      "name": "Cafe" 
     }, 
     { 
      "id": "218693881483234", 
      "name": "Pub" 
     } 
    ], 
    "place_topics": { 
     "data": [ 
      { 
       "name": "Pool & Billiard Hall", 
       "id": "197750126917541" 
      }, 
      { 
       "name": "Pub", 
       "id": "218693881483234" 
      } 
     ] 
    } 

Und lassen Sie uns sagen, dass diese die Arrays I gegen (fast die gleichen Daten) vergleichen wollen:

let cat_list = [ 
      { 
       "id": "197750126917541", 
       "name": "Pool & Billiard Hall" 
      }, 
      { 
       "id": "197871390225897", 
       "name": "Cafe" 
      }, 
      { 
       "id": "218693881483234", 
       "name": "Pub" 
      } 
     ] 
let place_tops = [ 
       { 
        "name": "Pool & Billiard Hall", 
        "id": "197750126917541" 
       }, 
       { 
        "name": "Pub", 
        "id": "218693881483234" 
       } 
      ] 
+0

Ist das Folgende wahr? Wir haben nur dann eine Übereinstimmung, wenn: - die zu vergleichenden Arrays die gleichen Längen wie ihre entsprechenden Arrays haben; - sie enthalten den gleichen Satz von IDs; - Datensätze mit derselben ID sollten denselben Namen haben, andere Felder können unterschiedlich sein. – cbartosiak

+0

Nun, tatsächlich enthalten die in MongoDB gespeicherten Daten auch eine Zeichenfolge _id, so dass sie falsch ist. –

+0

Ja, aber Sie haben geschrieben, dass Sie daran interessiert sind, Namen zu vergleichen, also nahm ich an, Sie wollten überprüfen, ob der Name trotz Übereinstimmung mit der ID derselbe war (aktuell oder smth). Es sieht so aus, als hätte ich dich missverstanden. – cbartosiak

Antwort

2

Wenn es "multiple conditions" erforderlich für jedes Array-Element ist, wenn Sie tatsächlich $elemMatch verwenden, und in der Tat "muss", sonst stimmen Sie nicht das richtige Element.

Organizations.find({ 
    "$or": [].concat(
    cat_list.map(c => ({ "category_list": { "$elemMatch": c } })), 
    place_tops.map(p => ({ "place_topics": { "$elemMatch": p } })) 
) 
}) 

jedoch, wenn Sie einen Schritt zurück und logisch darüber nachdenkt, Sie:

So mehrere Bedingungen anzuwenden, würden Sie eher eine Reihe von Bedingungen für $or statt Verknüpfungen mit $in machen tatsächlich genannt eine der Eigenschaften "id". Dies würde im Allgemeinen in alle guten Praxis bedeuten, dass der Wert in der Tat „“ einzigartig“

daher alles, was Sie wirklich brauchen sollen, ist einfach zu tun, um diese Werte extrahieren und mit der ursprünglichen Abfrage Form bleiben.

Organizations.find({ 
    "$or": [ 
    { "category_list.id": { "$in": cat_list.map(c => c.id) } }, 
    { "place_topics.id": { "$in": place_tops.map(p => p.id) } } 
    ] 
}) 

Mapping So einfach sowohl die Werte und die Eigenschaft auf „Spiel“ auf den "id" Wert statt. Dies ist ein einfaches "dot notation" Formular, das genügt in der Regel, wenn Sie ein Zustand pro Array-Element zu testen/Spiel.

That ist in der Regel am meisten logischer Ansatz angesichts der Daten, und Sie sollten anwenden, welche davon tatsächlich zu den Datenbedingungen passt, die Sie benötigen. Für "mehrfache" Verwendung $elemMatch. Aber wenn Sie nicht mehrere brauchen, weil es eine Singular-Übereinstimmung gibt, dann tun Sie einfach die Singular-Übereinstimmung

+0

Das scheint den Trick zu tun, gehe ich mit dem letzten Ansatz da es in beiden Aussagen ausreicht, eine Übereinstimmung zu haben. Ich danke dir sehr! –