2016-10-25 4 views
1

ich eine Sammlung von Dokumenten mit der folgenden Struktur in Mongo haben Meteor mit:Wie alle Dokumente zurückzugeben, die einen bestimmten Wert in einem Array in mongodb haben

{ 
... 
Name: 'Jane Doe', 
Finances: { 
    Owed: 0, 
    Due: 0, 
    Paid: [ 
    [400, 'Oct 2015'], 
    [300, 'Jan 2016'], 
    [500, 'Mar 2016'] 
    ] 
}, 
Address: '123 Mains Street', 
... 
} 

Ich möchte alle Dokumente zurückzugeben, Haben Sie einen Zahlungswert im Jahr 2016. In diesem Beispiel würde das obige Dokument tatsächlich zurückgegeben, da es mindestens ein Unterfeld [, 'Jan 2016'] innerhalb der Eigenschaft 'Bezahlt' hat. Wie kann ich die Abfrage in Mongo einrichten?

habe ich versucht, so etwas wie:

Collection.find({ 'Finances.Paid[0]': { $regex: '2016' } }); 

Aber ich würde durch alle inneren Arrays innerhalb ‚bezahlt‘ zu überprüfen, gehen müssen. Kann ich das streng in Mongo machen?

Antwort

0

Ich habe diesen Code nicht mit Ihren Daten versucht, aber Sie sollten es tun können, mit so etwas wie dieses

Collection.find({ Finances: {$elemMatch: {Paid: {$regex:'2016'}}}}) 

Es das Array von Paid Elemente

bearbeiten scannen: Try diese

Collection.find({ "Finances.Paid": {$elemMatch: { $regex:'2016'}}}) 

Siehe https://docs.mongodb.com/v3.2/reference/operator/query/elemMatch/ für eine Erklärung von $ elemMatch

+0

Kein Glück damit. –

2

Ist mit diesem Schemadesign schwierig.

Mongo ist nicht dazu gedacht, gut abzufragen, eine Liste, die Listen speichert, die verschiedene Arten von Werten speichern, d. H. [400, 'Oct 2015']. Besser wird für Abfragen der Finances Feld wie folgt gestalten:

Finances: [ 
    { 'a': 400, 'b': 'Oct 2015'}, 
    { 'a': 300, 'b': 'Oct 2016'}, 
    { 'a': 500, 'b': 'Oct 2016'} 
] 

als Sie Abfragen wie tun können:

db.Collection.find({ "Finances.Paid.b": { $regex:'2016'}}) 

Mit Ihrem Schema können Sie es mit Aggregation tun:

db.Collection.aggregate([ 
    { 
     $unwind: '$Finances.Paid'}, 
    { 
     $match: {'Finances.Paid':{ $regex: '2016' }} 
    }, 
    { 
     $group: { 
      _id:'$_id', 
      Name: {'$first': '$Name'}, 
      Address: {'$first': '$Address'}, 
      Finances: {'$first': '$Finances'} 
     } 
    }, 
]); 

Abfrageergebnis:

{ 
    "_id" : ObjectId("580fb7d6c37ebe91b0f943df"), 
    "Name" : "Jane Doe", 
    "Address" : "123 Mains Street", 
    "Finances" : { 
     "Owed" : 0, 
     "Due" : 0, 
     "Paid" : [ 
      300, 
      "Jan 2016" 
     ] 
    } 
} 

Das wird alle Dokumente zurückgeben, die einen Zahlungswert im Jahr 2016 gemacht haben, ist der Nachteil, dass nur eine Zahlung von 2016 zurückgibt, die erste, die es gefunden.

+0

Danke. Ich war gerade dabei, mein Schema in etwas Ähnliches zu ändern, um es zum Laufen zu bringen. –

Verwandte Themen