2011-12-20 12 views
6

Mam dokument w Mongo, że jest skonstruowany w następujący sposób:Zapytania zagnieżdżone Lista Istnienie w Mongo

{ 
    "_id" : ObjectId("4eea7237d0ba3a04f20008fb"), 
    "code" : "b2677c2809c844cc9d7e3e4ff8d95b46", 
    "city_id" : 4, 
    "datetime" : ISODate("2011-12-13T18:41:44.062Z"), 
    "plays" : [  
     { 
      "play_id" : 717224, 
      "clicks" : [ ], 
      "order" : 1, 
      "mysql_id" : 145 
     } 

Chcę zapytać o docs których plays.clicks atrybut jest niepusty lista. Próbowałem już bez powodzenia. Myślałem, że coś takiego może działać:

db.collection.find({plays.clicks.0: {$exists:true}}) 

Ale wierzę, że to zwróci tylko dokumenty, których pierwszy element tablicy zawiera listę odgrywa niepusty kliknięć.

Każda myśl o tym, jak mogę to zrobić?

Dzięki

Odpowiedz

7

db.collection.find({plays.clicks.0: {$exists:true}})

jest prawo Składnia, jednak jako plays jest listą, zapytanie będzie pasować do dowolny dokument, który ma kliknięcia w plays. W ten sposób nie można odzyskać podzbioru Array dla podelementów [1]. Jest to bilet na sub/wirtualnych zbiorach [2]

[1] http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

[2] https://jira.mongodb.org/browse/SERVER-828

+0

Dzięki Ross, to prawdopodobnie najlepsza odpowiedź (choć dodatkowa propozycja denormalizacji jest rozsądną alternatywą). – Ben

3

więcej wielkość listy jako oddzielny atrybutów (np num_plays). Następnie można wyszukać na dokumenty gdzie num_plays jest większa niż 0:

+0

mógłbym to zrobić. Z punktu widzenia czytania, to prawdopodobnie pozwala na najszybsze zapytania. – Ben

Powiązane problemy