2013-12-09 8 views
21

Próbuję użyć następującego zapytania w MongoDB, ale nie jest uruchomiony.

db.test.aggergate(
$match: {$and: [type: {$in: ["TOYS"]}, type: {$nin: ["BARBIE"]}, time: 
{$lt:ISODate("2013-12-09T00:00:00Z")}]}}) 

Mówi nieprawidłowy znak ":".

Czy można używać $ i z dopasowaniem $? Widziałem przykład na tym forum z $ lub z meczem $, więc założyłem, że jest to możliwe.

Z góry dziękujemy za pomoc i wskazówki.

+0

Przeczytaj dokumentację http://docs.mongodb.org/manual/reference/operator/aggregation/match/ – bodi0

+0

Dzięki za odpowiedź. Zbieram, że nie potrzebuję używać $ i ponieważ jest ono zawarte w zapytaniu? – Manus

+3

To jest zapytanie, które działa idealnie bez struktury agregacji, użyj zwykłego wyszukiwania. –

Odpowiedz

48

$ i z dopasowaniem $ działa dobrze.

Masz błędy składniowe w zapytaniu. Spróbuj tego.

db.test.aggregate([ 
        { 
        $match: { 
          $and: [ 
           {type: {$in: ["TOYS"]}}, 
           {type: {$nin: ["BARBIE"]}}, 
           {time: {$lt:ISODate("2013-12-09T00:00:00Z")}} 
          ] 
        } 
        } 
        ]) 

I za to, co staramy się robić, nie trzeba się $and.

+1

Cześć Ajai ..... dzięki za poprawkę. I tak, dowiedziałem się, że $ i nie jest wymagane. Dziękuję wszystkim za pomoc. – Manus

+1

Czy użycie "$ i" nie jest w tym przypadku zbędne? Przynajmniej w MongoDB 3.2+ wygląda na to. –

+1

Tak. $ i jest tutaj zbędny. Musimy odpowiedzieć na pytanie: "Czy można używać $ i z dopasowaniem $?" – 4J41

4

Jeśli ktoś chce odmówić moją odpowiedź, że jest OK, jest to typowe pytanie z brakiem badań

db.test.find({$and: [ {"type": {$in: ["TOYS"]}}, 
         {"type": {$nin: ["BARBIE"]}}, 
         {"time": {$lt:ISODate("2013-12-09T00:00:00Z")}} 
        ] 
}) 

i współpracuje z znalezienia, otrzyma tablicę meczów (ale nie jest to instrukcja mecz) Aggregation framework jest dla czegoś zupełnie innego, jak to się mówi, dla agregowania (count, sum, avg, a więc warto grupowania lub rozwijania, itp.)

+0

Dzięki za odpowiedź Maximiliano. Użyłem agregacji, ponieważ muszę pogrupować według identyfikatora użytkownika po dopasowaniu tych rekordów. Przepraszamy za podanie niepełnego obrazu problemu. Tak więc zbieram $ i nie jest to możliwe z agregacją wtedy ... – Manus

+3

Możesz użyć $ i z agregacją, ale nie musisz tego pisać, i jest domyślnie przy użyciu różnych filtrów, w rzeczywistości możesz potokować te filtry w przypadku gdy z nich potrzebuje innego rozwiązania. –

+2

'$ match' trwa' {} '. Oznacza to, że może zająć '$ i' po prostu w porządku. –

3
{ 
    $match: { 
    $or:[ 
     {'sender':sender, 'recipient':recipient}, 
     {'recipient':sender,'sender':recipient} 
    ] 
    } 
} 

użyciu $ lub

0

Poniżej jak robię z wieloma $ a wraz z $ lub

User.aggregate([ 
{ 
    $lookup:{ 
    from:'influencers', 
    localField:'_id', 
    foreignField:'user', 
    as:'influencer' 
} 
}, 
{ $match:{ '$and': 
    [ { '$and': [ { 'influencer.aboutMe.birthday': { '$lte': 2017-09-11T09:10:07.283Z } } ] }, 
    { '$and': [ { 'influencer.aboutMe.minPrice': { '$gte': 0 } } ] }, 
    { '$and': 
    [ { '$or': 
     [ { '$and': [ { 'influencer.followed_by': { '$gte': 0 } } ] }, 

     { '$and': [ { 'influencer.youTubeSubscribercount': { '$gte': 
    0 } } ] } ] } ] }, 
{ 'influencer.isAdminverified': true }, 
{ 'influencer.status': 'Verified' } ] } } 

]); 
Powiązane problemy