2013-11-14 2 views
0

У меня возникла проблема с созданием нового объекта в моем mongo-db. Я использую meteor-framework, и я хотел бы добавить новые подэлементы, в один массив подэлементов.создать новый объект в массиве (который находится в объекте, который находится в массиве, который является документом) в meteor/mongodb

Моя структура данных выглядит следующим образом:

{ 
     "_id" : "f9d01fd1ef22684353149851", 
     "name" : "Ueberschrift", 
     "items" : [  
        { "_id" : "be695ec7ffe71152088c57e1", 
        "name" : "asd", 
        "checked" : false, 
        "subitems" : [ ] 
        }, 
        { "_id" : "fe665ec7ffe78852088c22g8", 
        "name" : "asd", 
        "checked" : false, 
        "subitems" : [ ] 
        } 
       ] 
    }, 
    { 
      "_id" : "qw501fd1we522683531qw451",  
      ......... 
    }, ... 

Например, я хочу, чтобы добавить подэлемент

{ _id : 1, name : "MySubitemName" } 

к элементу с _id: "be695ec7ffe71152088c57e1"
, который находится в объекте "f9d01fd1ef22684353149851"

Я использовал следующую команду:

uid => "f9d01fd1ef22684353149851" and 
id => "be695ec7ffe71152088c57e1" 

Listitems.update({_id:uid, "items._id" : id}, 
    {"items.$.subitems": {$push: { _id : 1, name : "MySubitemName" }}}); 

Но это не сработает, база данных выглядит как раньше.

У кого-то есть идея?

+1

Я думаю, что синтаксис будет '{" $ push ": {" items. $. Subitems ": {/ * doc * /}}}'. Также обратите внимание на '' '' '' $ push' –

+0

@ExplosionPills спасибо за ваш ответ, но он тоже не работает, ... Я изменил свою команду на Listitems.update ({_ id: uid, "items._id": id}, {"$ push": {"items. $. Subitems": {_id: ue_id, name: текст}}}); Но единственное, что я получаю: > db.listitems.find() { "_id": "f9d01fd1ef22684353149851", "имя": "Ueberschrift", "элементы": [{ "_id": "be695ec7ffe71152088c57e1" , «имя»: «asd», «checked»: false, «subitems»: []}]} – lkathke

ответ

0

При определении структуры вашего документа предлагается одна вещь: Избегайте использования _id в вашей собственной схеме, так как это имя является внутренним mongodb для представления ObjectId. Если строго, что вы делаете это, используйте вместо этого id. См. http://docs.mongodb.org/manual/reference/object-id/.

Таким образом, ваш документ теперь может быть как:

{ 
    "id" : "f9d01fd1ef22684353149851", 
    "name" : "Ueberschrift", 
    "items" : [  
      { 
       "id" : "be695ec7ffe71152088c57e1", 
       "name" : "iop", 
       "checked" : false, 
       "subitems" : [ ] 
      }, 
      { 
       "id" : "fe665ec7ffe78852088c22g8", 
       "name" : "asd", 
       "checked" : false, 
       "subitems" : [ ] 
      } 
     ] 
} 

запрос обновления:

Listitems.update({ id:"f9d01fd1ef22684353149851", "items.id" : "be695ec7ffe71152088c57e1"}, {$push: {"items.$.subitems" :{ id : 1, name : "MySubitemName" }}}); 

Я проверил с помощью MongoDB консоли, и я предполагаю, что объект, поставляемый в запросе обновления совпадает с консолью.

Сообщите нам, если это сработало.

EDIT для улучшения комментарий: Так как вы это означает фактический идентификатор объекта (_id) при запросе, пожалуйста, посмотрите на код ниже, адаптированный в качестве возможного исправления для объекта привязки:

uid => ObjectId("f9d01fd1ef22684353149851") and 
id => ObjectId("be695ec7ffe71152088c57e1") 

Listitems.update({_id:uid, "items._id" : id}, 
    {$push: {"items.$.subitems" :{ id : 1, name : "MySubitemName" }}}); 
+0

благодарим вас за ответ, но он тоже не работает, я не получаю никаких ошибок, но набор данных не обновляется – lkathke

+0

Вы тестировали с измененной схемой (используя id вместо _id)? Это была проблема, когда я впервые протестировал ваш исходный код. – rdonatoiop

+0

Нет, я не изменил _id в моей схеме. Я генерирую его с помощью var id = new Meteor.Collection.ObjectID(). ValueOf(); Это неправильно? Или mongodb использует внутреннюю id-схему, которая не видна? – lkathke

0

Возможно, проблема заключается в том, что minimongo еще не поддерживает оператора-заполнителя манго «$». Если это так, ваше обновление может нормально функционировать при вызове с сервера, но сбой при вызове с клиента. Где вы звоните в это обновление?

Для примера обходного поставляемой команды Meteor, увидеть model.js их «партия» приложение здесь: https://github.com/meteor/meteor/blob/devel/examples/parties/model.js

Я вставил ключевые строки 144-156 ниже, включая их комментарии - в Короче говоря, они используют «$» на сервере и заменяют его индексом массива на клиенте.

if (Meteor.isServer) { 
    // update the appropriate rsvp entry with $ 
    Parties.update(
     {_id: partyId, "rsvps.user": this.userId}, 
     {$set: {"rsvps.$.rsvp": rsvp}}); 
    } else { 
    // minimongo doesn't yet support $ in modifier. as a temporary 
    // workaround, make a modifier that uses an index. this is 
    // safe on the client since there's only one thread. 
    var modifier = {$set: {}}; 
    modifier.$set["rsvps." + rsvpIndex + ".rsvp"] = rsvp; 
    Parties.update(partyId, modifier); 
    } 
+0

Я уже использую команды db на сервере, и он не работает ни – lkathke

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