2013-10-04 12 views
7

Mam następujące dane w MongoDB (uproszczone, co jest konieczne dla mojego pytania).Zapytanie MongoDB, aby znaleźć właściwość pierwszego elementu tablicy

{ 
    _id: 0, 
    actions: [ 
     { 
      type: "insert", 
      data: "abc, quite possibly very very large" 
     } 
    ] 
} 
{ 
    _id: 1, 
    actions: [ 
     { 
      type: "update", 
      data: "def" 
     },{ 
      type: "delete", 
      data: "ghi" 
     } 
    ] 
} 

Chciałbym znaleźć pierwszy rodzaj akcji dla każdego dokumentu, np.

{_id:0, first_action_type:"insert"} 
{_id:1, first_action_type:"update"} 

(Jest w porządku, jeśli dane skonstruowany inaczej, ale trzeba te wartości są obecne, jakoś.)

EDIT: Próbowałem db.collection.find({}, {'actions.action_type':1}), ale oczywiście, że zwraca wszystkie elementy tablicy actions .

NoSQL jest dla mnie zupełnie nowy. Wcześniej zapisałbym to wszystko w dwóch tabelach w relacyjnej bazie danych i zrobiłbym coś takiego jak SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document d.

+1

po prostu '... actions [0]' for 'collection .find method' –

+0

Te dokumenty są duże ... Chciałbym użyć projekcji lub czegoś, co pomogłoby mi uzyskać tylko to, czego potrzebuję. –

+0

można dodawać indeksy –

Odpowiedz

11

Można użyć $slice operatora w projekcji. (ale dla tego, co robisz, nie jestem pewien, czy kolejność tablic pozostaje taka sama po aktualizacji), aby pamiętać))

db.collection.find({},{'actions':{$slice:1},'actions.type':1}) 
1

Można również użyć Aggregation Pipeline wprowadzone w wersji 2.2:

db.collection.aggregate([ 
    { $unwind: '$actions' }, 
    { $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } } 
]) 
+0

Powoduje zwrot całej tablicy, istnieje potrzeba rozwinięcia grupy. w następujący sposób: db.collection.aggregate ([{$ unwind: '$ actions'}, {$ group: {_id: "$ _id", first_action_type: {$ first: "$ actions.type"}}}]) – attish

+0

Błąd składni: '{" $ actions.type "}' –

+0

@PaulDraper Przepraszam, miałem literówkę. Naprawiono, możesz spróbować teraz :) – Agis

Powiązane problemy