2016-05-09 19 views
0

Ich habe eine Sammlung wie:

{ 
    _id: 0, 
    items: [ 
    { item_id: 43, quantity: 2, price: 10 }, 
    { item_id: 2, quantity: 1, price: 240 } 
    ], 
    T: [ 
    { item_id: 2993, quantity: 3, price: 110 }, 
    { item_id: 90103, quantity: 4, price: 5 }, 
    { item_id: 398, quantity: 1, price: 300 } 
    ] 
} 
{ 
    _id: 1, 
    items: [ 
    { item_id: 23, quantity: 3, price: 110 }, 
    { item_id: 103, quantity: 4, price: 5 }, 
    { item_id: 38, quantity: 1, price: 300 } 
    ], 
    T: [ 
    { item_id: 23, quantity: 3, price: 110 }, 
    { item_id: 103, quantity: 4, price: 5 }, 
    { item_id: 38, quantity: 1, price: 300 } 
    ] 
} 
{ 
    _id: 2, 
    items: [ 
     { item_id: 4, quantity: 1, price: 23 } 
    ], 
    T: [ 
    { item_id: 203, quantity: 3, price: 110 }, 
    { item_id: 003, quantity: 4, price: 5 }, 
    { item_id: 398, quantity: 1, price: 300 } 
    ] 
} 

ich ein alle Elemente im Element-Array mit einem Preis> = 100 zurückkehren wollen, die mit der folgenden getan wird:

$project: { 
     items: { 
      $filter: { 
       input: "$items", 
       as: "item", 
       cond: { $gte: [ "$$item.price", 100 ] } 
      } 
     } 
     } 

Wie kann ich diesen Ausdruck $filter auf dem items Array erweitern und die T Array alle Elemente, die einen Preis> = 100 haben?

+0

Hallo JohnnyHK, ich mag im Grunde filtern sowohl auf die T und Element-Array mit dem gleichen Bedingung. Ich erwarte also, dass die Ausgabe alle Dokumente mit dem T- und items-Array enthält, die nur Elemente mit einem Preis> = 100 enthalten –

Antwort

1

können Sie beide sind die items und T Felder in den gleichen $project, jeder mit seinem eigenen $filter:

db.test.aggregate([ 
    {$project: { 
     items: { 
      $filter: { 
       input: "$items", 
       as: "item", 
       cond: { $gte: [ "$$item.price", 100 ] } 
      } 
     }, 
     T: { 
      $filter: { 
       input: "$T", 
       as: "t", 
       cond: { $gte: [ "$$t.price", 100 ] } 
      } 
     } 
    }} 
])