Mongo db не будет обновлять существующий документ

#java #mongodb #spring-data

#java #mongodb #spring-данные

Вопрос:

Я использую java pojo и spring MongoTemplate, я потратил несколько часов, пытаясь понять, почему MongoDB не обновит существующий документ
Я могу вставлять документы, но не обновлять существующие
Есть какой-нибудь простой способ отследить это в mongo / spring?
Я пробовал до сих пор:
Просто вызовите save:

         person.setUpdateDate(new Date());
        mongoTemplate.save(person);
        //not working
  

вызовите updateFirst

         mongoTemplate.updateFirst(new Query(Criteria.where("_id").is(person.getId())),
                                    Update.update("objName", "NotWorking"),Person.class);
  

Сначала получите коллекцию, преобразуйте в объект DB,
затем найдите и измените:

         DBCollection coll=mongoTemplate.getCollection("Person");
        DBObject mongoPerson = morphia.toDBObject(person);
        DBObject afterSave = coll.findAndModify(new BasicDBObject("id", person.getId()), mongoPerson);
        //afterSave is null
  

Попробуйте найти по _id, затем сохраните:

         DBObject mongoPerson = morphia.toDBObject(person);
        Person found1 = mongoTemplate.findById(person.getId(), Person.class);
        found1.setObjName(person.getName());
        mongoTemplate.save(found1);
  

Сначала найдите, затем сохраните, используя «_id»:

         DBCursor found = coll.find(new BasicDBObject("_id", person.getId()));
        DBObject first = found.next();
        mongoTemplate.save(first);
  

Сначала найдите, затем сохраните, используя «id»:

         DBCursor found = coll.find(new BasicDBObject("id", person.getId()));
        DBObject first = found.next();
        mongoTemplate.save(first);
  

Попробуйте найти и изменить, затем сохранить:

         DBObject afterSave = coll.findAndModify(new BasicDBObject("id", person.getId()), mongoPerson);
        //afterSave is null
        mongoTemplate.save(person);
  

Обновите отдельные поля с помощью запроса:

         Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(person.getId()));
        mongoTemplate.updateFirst(query, new Update().set("name",person.getName())
                                                     .set("desc", person.getDesc())
                                                      .set("updateDate",new Date())
                                                          , 
                                                        Person.class)
  

Комментарии:

1. как вы определяете, что обновления не работают? попадают ли они на сервер? как они выглядят? если вы установите для mongod значение logging равным 1 или verbose, то он будет печатать в журнале каждую предпринятую операцию, успешную или неудачную.

2. Я не уверен, какое отношение к этому имеет профилировщик, но getlasterror — это не запись, это команда, отправленная после записи. найдите «обновление» в журналах.

3. вам не нужно перезапускать mongod — просто запустите db.adminCommand({setParameter: 1, LogLevel: 1}) (и когда вы захотите установить его обратно с помощью LogLevel: 0)

4. какую версию вы используете?

5. запустите обычный запрос в этой базе данных db.person.find({ _id: ObjectId(’53b98c56ee7957044fc40667′) }) — похоже, что не было найдено соответствующего документа. Какой из вышеперечисленных способов вы используете здесь?

Ответ №1:

* Обновить это тоже работает:

 mongoOperations.save(person,"Person");
  

Используя эту статью, я смог заставить обновление работать — не так, как я хочу, но…Это работает…

 import static org.springframework.data.mongodb.core.query.Criteria.where;  
import static org.springframework.data.mongodb.core.query.Query.query;  
import static org.springframework.data.mongodb.core.query.Update.update; 

@Controller
public class PersonController {

@Autowired
private MongoTemplate mongoTemplate;

@Autowired
MongoOperations  mongoOperations;

...

mongoOperations.updateFirst(query(where("_id").is(person.getId())), Update.update("name", newPersonName),"Person");  
  

Пока не уверен, почему это работает, пока

 mongoOperations.save(person);
  

Не работает…

Комментарии:

1. ага, save без второго аргумента попытается сохранить в коллекцию для типа сущности объекта для сохранения. Этот тип объекта в вашей конфигурации не является Person . На самом деле вы нигде не показываете объявление переменной person — каков ее тип / класс?

2. Мне все еще любопытно, почему MongoOperations.save(person) не сработал — я думаю, что если тип person есть Person, то он должен быть эквивалентен…

3. если вы передаете только объект person, где есть место для ошибки?

4. Я подумал, возможно, конфигурация или, может быть, person не относится к классу Person — вы показали свое определение класса, как выглядит объявление person? Возможно, поместите весь ваш код в gist с указателем на него — действительно сложно уверенно отлаживать фрагменты кода.

Ответ №2:

Вам нужно добавить имя базы данных в такие методы, как:

     public class UserInfoService{

    public static final String INFO = "info";

    public void someMethod(UserInfo userinfo){
        mongo.save(userinfo, INFO);
    }
  

если вы этого не сделаете, mongo сохранит ваши данные в базе данных с именем userInfo (с заглавной буквы ‘I’
).