2016-08-29 3 views
1

Wäre in einem Array für ein bestimmtes Element regex sagen, dass wir eine Sammlung haben wie folgt strukturiert:MongoDB:

{ 
    _id:1, 
    tag:["speaker","tom"] 
}, 
{ 
    _id:2, 
    tag:["subject","tomatoes"] 
} 
{ 
    _id:3, 
    tag:["subject","space"] 
} 

ich für bestimmte Elemente, wie zum Beispiel abfragen kann:

db.tags.find({tag:["speaker","tom"]}) 

Jetzt ist es möglich, eine Abfrage mit einer Regex durchzuführen, die dem zweiten Element dieses Arrays entspricht? so etwas wie:

db.tags.find({tag:["speaker",/tom.*/]}) ? 

Ein regex auf dem Feld tag (dh: db.tags.find({tag:/sp.*/})) würde das gesamte Array passen, und ich bin nach einem Weg suchen, um es nur auf dem zweiten Suche zu machen ... vor der Prüfung diese Sammlung umstrukturieren zu müssen.

aktualisiert

Eine Abhilfe den $all Operator zu verwenden ist:

db.tags.find({tag:{$all : ["speaker",/tom.*/]} }) 

, die gleich ist:

db.tags.find({ $and: [ { tag: "speaker }, { tags: /tom.*/ } ] } 

Allerdings, das ist nicht der richtige Weg zu tun, da Beide Elemente werden sowohl auf die Zeichenfolge als auch auf die Regex überprüft.

Antwort

1

Erlauben Sie mir, mich zu lösen. Ich fand man kann es auf diese Weise tun mit der Aggregation Rahmen

db.tags.aggregate([ 
    {$match: {"tag.1" : {$exists: 1}}}, 
    {$project: {one: {$slice: ["$tag", 1]}, two: {$slice: ["$tag", 1,2]}}}, 
    {$match: {one: "speaker", two: /tom.*/}} 
]) 

ersten Teil stellen Sie sicher, das Array atleast 2 Elemente. das Projekt das erste Element auf one und das zweite Element auf two mit Scheibe dann gegen das einzelne Element in jedem Array jetzt übereinstimmen.

Sie können dann entweder die ID abrufen und zur ursprünglichen Sammlung zurückkehren und eine weitere Abfrage ausführen oder weitere Projektionen hinzufügen und die erforderlichen Daten aus dem Aggregationsframework extrahieren.

+0

Ja Entschuldigung. Ich nehme an, seit diese Abfrage funktioniert db.tags.find ({"tag.1": {$ exists: 1}}), dass Sie etwas Ähnliches mit einer Suche tun könnten, aber das scheint nicht der Fall zu sein. – ThrowsException

+1

Absolut: mehr als eingelöst: absolviert! – Flint