2015-04-13 2 views
0

Так что я пытаюсь вставить объект в параметры и не увенчался успехом. Моя структура MongoDB выглядит следующим образом:Вставить объект в вложенный массив mongodb nodejs

[ 
    { 
     "_id": "04", 
     "name": "test service 4", 
     "id": "04", 
     "version": "0.0.1", 
     "title": "testing", 
     "description": "test", 
     "protocol": "test", 
     "operations": [ 
      { 
       "_id": "99", 
       "oName": "test op 52222222222", 
       "sid": "04", 
       "name": "test op 52222222222", 
       "oid": "99", 
       "parameters": {}, 
       "description": "testing", 
       "returntype": "test" 
      }, 
      { 
       "_id": "58", 
       "oName": "test op 52222222222", 
       "sid": "04", 
       "name": "test op 52222222222", 
       "oid": "58", 
       "parameters": {}, 
       "description": "testing", 
       "returntype": "test" 
      } 
     ] 
    } 
] 

Я хочу, чтобы иметь возможность добавить объект в параметры с основными деталями, такими как имя, идентификатор и тип. Я не совсем уверен, как справиться с этим, поскольку у меня есть все другие операции CRUD, реализованные до части параметров. Как мне это сделать? Я знаю, что у mongodb возникают проблемы при попытке вставить что-то в массив внутри массива, поэтому, если у кого-то есть какие-то предложения относительно того, как я могу это сделать, я бы очень признателен. Благодарю.

Одна из проблем заключается в том, что у меня нет доступа к _id корневого объекта, но у меня есть _id для операции, в которую я вставляю параметр. Поэтому я пытался вставить параметр, используя этот код:

collection.update({"operations":{"$elemMatch": {"oid": oid}}}, {'$addToSet':{"operations.parameters": {name: "test"} }}, {safe:true}, function(err, result) { 
     if (err) { 
      res.send({'error':'An error has occurred'}); 
     } else { 
      res.send(result[0]); 
     } 
    }); 

Это не работает.

ответ

2

я смог завершить вставку, используя следующий код:

collection.update({ "operations": {$elemMatch: {_id:oid}}}, {$addToSet: { "operations.$.parameters" : parameter}}, function(err, result) { 
     if (err) { 
      res.send({'error':'An error has occurred'}); 
     } else { 
      res.send(result[0]); 
     } 
}); 

На всякий случай кому-то это нужно.

+0

Как я уже сказал, вам нужно использовать позиционный оператор .... –

-1

Это потому, что вам нужно использовать positional operator, пример я копирую из ссылки почти так же, как в вашем случае:

db.students.update(
    { _id: 4, "grades.grade": 85 }, 
    { $set: { "grades.$.std" : 6 } } 
) 
+0

проблема заключается в том, что это выполняется с помощью пост-вызова в nodejs api, и в этом случае у меня нет доступа к _id 04, вот почему я делаю $ elemMatch, мой также является массивом внутри массива (параметры внутри операций). Я пробовал этот пример путем жесткого кодирования начального _id, и он все еще не работает. –

+0

У вас есть '_id' операции. Это уникально по всей коллекции? Если это так, вы можете использовать '$' и сопоставлять условие 'operations._id: ', очень похожее на образец выше. Если нет, ваше обновление плохо определено. Вы хотите обновить одну операцию с помощью данного '_id'? Который из? Вы заботитесь? Вы хотите обновить их все с помощью '_id'? – wdberkeley

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