#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’
).