2017-04-20 1 views
0

Ich habe ein Problem beim Filtern eines Array von Werten eines bestimmten Dokuments. Der Name der Sammlung ist Listen und ich habe ein Dokument mit 'Felder' als _id. Hier ist ein Teil des Dokuments:

{ 
"_id" : "fields", 
"values" : [ 
    { 
     "name" : "sku", 
     "dt" : "text" 
    }, 
    { 
     "name" : "title", 
     "dt" : "text" 
    }, 
    { 
     "name" : "desc", 
     "dt" : "text" 
    }, 
    { 
     "name" : "brand", 
     "dt" : "text" 
    }, 
    { 
     "name" : "cur", 
     "dt" : "text" 
    }, 
    { 
     "name" : "l_img", 
     "dt" : "text" 
    }, 
    ..... 
    ] 
} 

Ich brauche ein Array von Strings abzurufen, die einen angegebenen regulären Ausdruck entsprechen.

Dies ist meine Frage:

db.lists.aggregate([ 
{ 
    $match : { _id: "fields"} 
}, 
{ 
    $project: { 
     values: { 
      $filter: { 
      input: "$values", 
      as: "val", 
      cond: { "$$val.name" : { $regex: /sk/i } } 
      } 
     } 
    } 
} 
]); 

und das ist der Fehler, den ich bekommen:

assert: Befehl fehlgeschlagen: { "ok": 0, "errmsg": „ungültiger Operator‚$ $ val.name '"," code ": 15999}: Aggregat fehlgeschlagen

Ich versuchte die Situation der Post How to filter array in subdocument with MongoDB und es funktioniert gut, aber für meine Bedürfnisse und Dokumentstruktur implementiert nicht. Wo ich falsch mache ??

Die älteste Syntax (vorherige Version 3.2) funktioniert:

db.lists.aggregate(
{ $match: {_id: "fields"}}, 
{ $unwind: '$values'}, 
{ $match: {'values.name': { $regex: /sk/i }}}, 
{ $group: {_id: '$_id', values: {$push: '$values.name'}}}) 

In der Tat erhalte ich:

{ "_id" : "fields", "values" : [ "sku", "sku_parent", "skin_type", "skin_tone" ] } 

Meine Mongo DB-Version ist 3.2.9.

+0

Haben Sie versucht, nur einen $ im $$ val.name –

+0

$ regex zu setzen ist nicht Ausdruck in Filter unterstützt, versuchen Sie mit anderen Ausdrücken es – AshokGK

+0

Hallo AshokGK, das Problem scheint funktioniert nicht um die Regex zu sein: siehe meine folgende Post –

Antwort

0

das Problem scheint nicht die Regex zu sein:

db.lists.aggregate([ 
{ 
    $match : { _id: "fields"} 
}, 
{ 
    $project: { 
     values: { 
     $filter: { 
      input: "$values", 
      as: "val", 
      cond: { "$$val.name" : "sku" } 
     } 
    } 
    } 
} 
]); 

assert: Befehl fehlgeschlagen: { "ok": 0, "errmsg": "ungültiger Operator '$$ val.name'", " Code“: 15999}: Aggregat fehlgeschlagen

+1

Das Problem ist mit Ihrem 'cond'. Probiere 'cond: {$ eq: [" $$ val.name "," sku "]}' und regex wird in '$ project' nicht unterstützt. https://jira.mongodb.org/browse/SERVER-11947 & https://jira.mongodb.org/browse/SERVER-8892 – Veeram

+0

Danke, ich werde dann auf die alte Syntax weiterleiten! Ich brauche die Regex. –