2014-11-22 2 views
1

У меня есть документ вроде следующего: enter image description hereкак обновить только один элемент массива при обновлении

, как вы можете видеть, у меня есть объект массива: {1,3,4}

Теперь я хотите просто изменить от 4 до 10 в этом массиве и обновлять его, что у меня есть следующий код:

DBCollection coll = db.getCollection("test"); 
    BasicDBObject newDocument = new BasicDBObject(); 
    BasicDBObject searchQuery = new BasicDBObject().append("time", "20141105230000"); 

    coll.update(searchQuery, newDocument); 
    String[] str = { "1", "3", "10" }; 
    DBObject updateMatchingElem = new BasicDBObject("$set", 
      new BasicDBObject().append("entity", str)); 
    coll.update(searchQuery, updateMatchingElem); 

Но этот путь не является хорошим способом, потому что я как бы удалить объект, а затем вставить весь массив снова. Есть ли в любом случае, что я могу просто изменить один элемент, например, от 4 до 10?

+0

Я дам вам подсказку в собственном драйвере mongo: 'db.collection.update ({" entity ": 4}, {$ set: {" entity. $ ": 10}})'. Вы можете попытаться реализовать его на Java. В mongodb вы можете обновить только один единственный элемент массива в одном запросе, даже если в массиве есть другие соответствующие элементы. Например, если в массиве есть два 4s, будет обновляться только первая ошибка 4. – BatScream

ответ

2

Теперь я хочу просто изменить от 4 до 10 в этом массиве и обновлять его

Вы можете сделать это следующим образом, с помощью позиционного оператора $.

//db.collection.update({"entity":4},{$set:{"entity.$":10}}) 
    DBObject find = new BasicDBObject("entity", 4); 
    DBObject set = new BasicDBObject("entity.$", 10); 
    DBObject update = new BasicDBObject().append("$set", set); 
    coll.update(find, update); 

Обратите внимание, что вы можете в большинстве обновлений только один единственный элемент соответствующего массива, даже если есть другие элементы согласования в массиве. Например, если в массиве есть два 4s, только обновление будет обновляться. Так работает позиционный оператор.

Всякий раз, когда вы используете оператор позиционирования в запросе на обновление, запрос на поиск должен содержать поле в части запроса find.

+0

Большое спасибо за помощь, этот код работает хорошо, но когда я пытаюсь, например, просто обновить сущность в экземпляре, в котором это имя, например, john, это не работает. Я использую следующий код: BasicDBObject searchQuery = new BasicDBObject() .append ("name", "john"); \t BasicDBObject find = new BasicDBObject ("entity", 1000); BasicDBObject иQuery = new BasicDBObject(); \t Список obj = new ArrayList (); \t obj.add (searchQuery); \t obj.add (найти); \t andQuery.put ("$ and", obj); и затем я пишу и запрашиваю команду update, но ничего не происходит, возможно ли это сделать? –

+0

изменить его на: 'DBObject find = new BasicDBObject (" entity ", 1000) .append (" name "," john ")' – BatScream

+0

Большое спасибо. Потрясающие :). –

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