2013-06-17 2 views
2

У меня есть БД с набором полей f1, f2, f3, где f3 - массив. Я хотел бы сделать операцию обновления, такими как этогоMongodb update array с другим полем

db.collection.update ({f1: 1}, {$ толчок: {f3: {$ каждый: [значение f2 игровых], $ ломтик: -2}}})

Я искал в Интернете и не мог ничего найти. Я не уверен, что это возможно. Любая помощь приветствуется.

Пример:

Это мой набор документов:

doc1 = { name: "User1", score: "Good", History of scores: ["Good", "Bad", "Average", "Bad"] } 
doc2 = { name: "User2", score: "Bad", History of scores: ["Good", "Average", "Average", "Bad"] } 
doc3 = { name: "User3", score: "Good", History of scores: ["Good", "Good", "Average", "Good"] } 

Теперь предположим, что мы должны вставить соответствующие данные:

{name : "User1", score: "Good"} 

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

doc1 = { name: "User1", score: "Good", History of scores: ["Bad", "Average", "Bad", "Good"] } 

другой того же обновления должны изменить doc1 на:

doc1 = { name: "User1", score: "Good", History of scores: ["Average", "Bad", "Good", "Good"] } 

Я надеюсь, что теперь мой вопрос стал яснее. Благодарю.

+1

было бы неплохо, если бы вы добавить пример –

+0

@artech спасибо. Я добавил пример. – Sai

ответ

2

Попробуйте это:

> db.c.find() 
{ "_id" : ObjectId("51c156d25a334e9347b576a7"), "name" : "User1", "score" : "Good", "scores" : [ "Good", "Bad", "Average", "Bad" ] } 
> db.c.update({}, {$push: {scores:{$each:['111', '222'], '$slice': -4}}}) 
> db.c.find() 
{ "_id" : ObjectId("51c156d25a334e9347b576a7"), "name" : "User1", "score" : "Good", "scores" : [ "Average", "Bad", "111", "222" ] } 

кстати, я есть проблема с этим видом обновлений: если новый объект терка, то предыдущий размером, он вызывает перемещение этого объекта в другое место на диске (например, вы нажали «Average» и выбили «Bad»). Обновления «на месте» быстрее, вы можете предварительно выделить место для объектов на первой вставки, например, так:

> db.c.insert({ "_id" : ObjectId("51c156d25a334e9347b576a7"), "name" : "<big_tmp_string>", "score" : "<big_tmp_string>", "scores" : [ "<big_tmp_string>", "<big_tmp_string>", "<big_tmp_string>", "<big_tmp_string>" ] }) 
> db.c.update({ "_id" : ObjectId("51c156d25a334e9347b576a7")}, {<your_real_obj>} 
+0

@arrtech Спасибо. Однако в этом примере значения «111» и «222» известны и вставляются вручную пользователем каждый раз, когда запрос запрашивается. Функцией, на которую я надеялся, было принять значения «111» и «222», содержащиеся в другом поле, например «оценка», чтобы значения не нужно вводить вручную в запрос. Указатель о размере нового объекта был действительно новой вещью и очень полезной информацией. Спасибо. – Sai

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