2012-12-21 22 views
36

Mam następujący dokument przechowywany w MongoDB:Jak wstawić element do wewnętrznej listy MongoDB?

{ 
    name: 'myDoc', 
    list: [ 
     { 
      id:1 
      items:[ 
       {id:1, name:'item1'}, 
       {id:2, name:'item2'} 
      ] 
     }, 
     { 
      id:2 
      items:[ 
       {id:1, name:'item1'}, 
       {id:3, name:'item3'} 
      ] 
     } 
    ] 
} 

znalazłem sposób, aby dodać element do „listy” używając $addToSet ale nie mogłem znaleźć sposób, aby dodać do określonej listy „rzeczy” przedmiot.

np. uzyskać następujące:

{id:5, name:'item5'} 

i chcę, aby dodać go do pozycji elementu w liście z id: 2.

Odpowiedz

32

Jednym ze sposobów byłoby z $push:

db.col.update(
    { name: 'doc', 'list.id': 2 }, 
    {$push: {'list.$.items': {id: 5, name: 'item5'}}} 
) 

http://docs.mongodb.org/manual/reference/operator/push/

Można również zastąpić $push z innymi operatorami takimi jak (ewentualnie) $addToSet aby uzyskać dokładne wyniki, którego szukasz.

11

Można to wykorzystać: -

> var toInsert = {id: 5, name: 'item6'} 
> db.abc.update(
      { name: 'myDoc', list: { $elemMatch: { id: 2 } } }, 
      { $addToSet: { 'list.$.items': toInsert } } 
) 

query część znajdzie się dokument z tablicy list z id = 2. Następnie używamy elementu pozycyjnego $, aby dodać nowy element do indeksu tablicy.

Zobacz positional $ operator


Można również zastąpić list: {$elemMatch: {id: 2}} z tylko 'list.id': 2.

Ale użycie opcji $elemMatch będzie lepsze, jeśli chcesz aktualizować na podstawie wielu elementów tablicy. Np, gdy Twoje kryteria dopasowania jest id i niektóre inne pole w tablicy powiedzieć length: -

list: {$elemMatch: {id: 2, length: 5}} 
+0

Przypis, schematy z zagnieżdżonych wbudowanych tablic są prawie zawsze będzie powodować problemy później, ponieważ nie wszystkie operacje na dolnych elementach poziomie są możliwe w bieżącym języku zapytań. Uniknęłbym tego. –

Powiązane problemy