2015-10-27 3 views
0

Я новичок в meteor/mongo/js как стек, и я теряюсь в массивах JSON и ссылаюсь на них. Основано another SO answer (и документы) Я думаю, что я близко ...Обновление вложенных массивов Meteor/Mongo

Документ в коллекции заказов, документ имеет вложенные массивы.

Order -> orderLines -> lineItems: 

Образец документ:

{ 
"_id" : "27tGpRtMWYqPpFkDN", 
"orderLines" : [ 
    { 
     "lineId" : 1, 
     "name" : "Cheese & Pickle", 
     "instructions" : "", 
     "lineItems" : [ 
      { 
       "name" : "Cheddar Cheese", 
       "quantity" : 1 
      }, 
      { 
       "name" : "Branston Pickle", 
       "quantity" : 1 
      }, 
      { 
       "name" : "Focaccia Roll", 
       "quantity" : 1 
      } 
     ] 
    } 
    ] 
} 

То, что я пытаюсь сделать из метеора/Монго оболочки:

  1. Добавить "инструкции" о "Foo" в OrderLines где lineId = 1
  2. Положить новый товар на строкуИнтересный массив

Это зависла ...

meteor:PRIMARY> db.orders.update({_id:"27tGpRtMWYqPpFkDN","orderLines.lineId":"1", {$set: {"orderLines.$.instructions":"foo"}}) 
... 

Это не так, как идентификатор в запросе

meteor:PRIMARY> db.orders.update({_id:"27tGpRtMWYqPpFkDN", "orderLines.lineId":"1"}, {$push:{"orderLines.$.lineItems":" { "name" : "butter", "quantity" : 1}"}}); 
2015-10-27T16:09:54.489+0100 SyntaxError: Unexpected identifier 
+0

Вы будете счастливы, если вы повторно-фактор это, чтобы удалить массивы - это делает много запросов Монго проще/быстрее/возможно. Я бы сделал коллекцию 'OrderLine', которая имеет порядок' _id' в качестве поля; то у меня будет коллекция 'LineItem', которая будет ссылаться на' OrderLine'. Хотя теперь это кажется более сложным, это облегчит запросы и потенциальные математические операции. –

+0

Спасибо, осень, я думаю, что мне придется делать то, что вы говорите, но это немного похоже на _relational'_ :) – Andy

ответ

0

$push добавляет новый элемент в массив. Вы просто пытаетесь установить значение определенного ключа в элементе массива.

Try:

db.orders.update({ _id: "27tGpRtMWYqPpFkDN", "orderLines.lineId": 1}, 
    { $set: { "orderlines.$.instructions": "foo" }}) 

docs

+0

Спасибо Мишель, я использовал $ set для первой задачи, обновляющей «инструкции»; $ push был для обновления массива, которое я делал во второй задаче. – Andy

0

Спасибо всем за ваши комментарии ... но я нашел некоторые ответы, отправленные для справки

Пункт 1 - с помощью $ устанавливается на значение в пределах массива

Это было неудачно из-за двух опечаток, одно отсутствовавшее закрытие} в конце qu ery, второй цитировал значение «1» для itemId в запросе.

Это работает:

db.orders.update({_id:"27tGpRtMWYqPpFkDN", orderLines.lineId":1}, 
{$set: {"orderLines.$.instructions":"foo"}}) 

Я также понял, что, когда я сказал: «Это, как представляется, повесить» это кли ожидает действительного заявления, так намеки на недостающий} или)!

Пункт 2 - с помощью $ толчок, чтобы добавить данные в массив - 2 уровней вложенных

Это неисправного из-за приведением вокруг массива данных

db.orders.update({_id:"27tGpRtMWYqPpFkDN", "orderLines.lineId":1 }, 
{$push:{"orderLines.$.lineItems": { "name" : "butter", "quantity" : 1} }}) 

Вложенные массивы: можно использовать $ оператор позиционирования

То, что я хочу сделать дальше, это использовать $ set на элементе в массиве второго уровня, и для этого потребуется использовать оператор $ positional дважды:

db.orders.update({"orderLines.lineId":1, lineItems.name:"Cheddar Cheese"}, 
{$set: {"orderLines.$.lineItems.$.quantity": 2}}) 

Это выдает ошибку:

Too many positional (i.e. '$') elements found in path 

There is an open MongoDB enhancement request for this но это был открыт с 2010

Смежные вопросы