2015-08-21 2 views
0

Что не так с моим синтаксисом, чтобы вставить JSON в существующий массив?Нажать JSON в существующий синтаксис массива некорректно - MongoDB

> db.accounts.update({"accounts.username":"gattra"},{$push:{logbooks:[{firstLogbook:{"date":"Aug 24, 2015","location":"Brunswick,ME"}}]}}) 
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 }) 

Еще одна попытка:

> db.accounts.update(
{"accountInfo.username":"gattra"}, 
{ $addToSet: { 'logbooks.$.firstLogbook': toInsert } } 
) 
WriteResult({ 
"nMatched" : 0, 
"nUpserted" : 0, 
"nModified" : 0, 
"writeError" : { 
    "code" : 16837, 
    "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: logbooks.$.firstLogbook" 
} 
}) 

Похоже, это говорит, что не нашли никаких совпадений по моим критериям, но если вы посмотрите на документ ниже вы можете увидеть, что есть учетная запись с имя пользователя «gattra».

Я новичок в MongoDB, и я не совсем понимаю документацию по веб-сайтам.

Документ, содержащий массив:

> db.accounts.find().pretty() 
{ 
"_id" : ObjectId("55d6450dd745a23c6cfa2b23"), 
"accountInfo" : { 
    "username" : "gattra", 
    "password" : "PASS", 
    "userid" : 1111 
}, 
"logbooks" : [ 
    { 
     "firstLogbook" : [ 
      { 
       "date" : "August 10, 2015", 
       "location" : "Portland, ME", 
       "routeName" : "Trendsetter", 
       "grade" : "V10", 
       "type" : "Bouldering", 
       "time" : "4:30.05", 
       "pcl" : 10, 
       "notes" : "My first V10 ever!", 
       "photoUrl" : "" 
      } 
     ] 
    } 
] 
} 

EDIT: Исправленная версия Благодаря @Allen Чоу за помощь.

Я в конечном итоге восстановления коллекции счетов выглядеть следующим образом:

{ 
"accountInfo":{ 
"username":"broderick", 
"password":"PASS", 
"userid":1111 
}, 

"logbooks": 
[{ 
"firstLogbook": { 
    "id":1234, 
    "info":[{ 
     "date":"August 10, 2015", 
     "location":"Portland, ME", 
     "routeName":"Trendsetter", 
     "grade":"V10", 
     "type":"Bouldering", 
     "time": "4:30.05", 
     "pcl":10, 
     "notes":"My first V10 ever!", 
     "photoUrl":"" 
    }] 
} 
}] 

}

Добавляя "id" поле я могу использовать идентификатор в качестве параметра с конкретным указанием. Затем я поместил содержимое в поле "info".

Рабочий запрос:

> db.accounts.update({"accountInfo.username": "broderick", "logbooks.firstLogbook.id":1234},{$push:{"logbooks.$.firstLogbook.info":{"date":"Aug 24, 2015"}}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

ответ

1

Похоже, вы хотите добавить новый документ в массив firstLogbook.

Для $ в обновлении массива, он идентифицирует элемент в массиве для обновления без явного указания позиции элемента в массиве,

Основной синтаксис являются:

db.collection.update(
    { <array>: value ... }, // locate array to update 
    { <update operator>: { "<array>.$" : value } } 
) 

Так в соответствии с указанным выше форматом, это может решить вашу проблему.

db.accounts.update(
    { 
     "accountInfo.username": "gattra", 
     "logbooks.firstLogbook": { $exists: true } 
    }, 
    { 
     $push: 
     { 
      "logbooks.$.firstLogbook" : 
      { 
       "date":"Aug 24, 2015", "location":"Brunswick,ME" 
      } 
     } 
    } 
) 
+0

это сработало, спасибо! Вопрос: мне нужен этот параметр журнала в первом наборе скобок с '{" accountInfo.username ":" gattra "," logbooks.firstLogbook.pcl ": 10}'? Думаю, мне интересно, почему мне нужно специфицировать другой JSON-объект, если единственное, что имеет значение, это то, что я хочу, чтобы этот новый объект JSON был вставлен в список «firstLogbook» – broderickga

+0

, чтобы расширить его, теперь я вижу, что, по сути, что происходит Я задаю массив для обновления. Но нужно ли включать поле и значение объекта в этот массив? Или я могу просто сказать что-то вроде '' logbooks.firstLogbook'', без каких-либо значений? – broderickga

+0

hmm okay, так что это звучит как на интерфейсе, когда пользователь вводит новую запись в журнал, мне нужно будет зацепить поле и значение из другой записи журнала и использовать его для соответствия массиву – broderickga

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