MongoDB에서 현재 날짜와 시간을 삽입하려면 $setOnInsert 연산자를 사용하면 됩니다. 이 연산자는 문서가 실제로 새로 삽입되는 경우에만 필드 값을 설정하므로, 생성 시점의 타임스탬프를 기록할 때 특히 유용합니다.
1. 샘플 컬렉션 생성하기
먼저 다음 쿼리를 실행하여 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.addCurrentDateTimeDemo.insertOne({"StudentName":"John","StudentAdmissionDate":new Date("2012-01-21") });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c97ae45330fd0aa0d2fe49f")
}
> db.addCurrentDateTimeDemo.insertOne({"StudentName":"Carol","StudentAdmissionDate":new Date("2013-05-24") });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c97ae54330fd0aa0d2fe4a0")
}
> db.addCurrentDateTimeDemo.insertOne({"StudentName":"Carol","StudentAdmissionDate":new Date("2019-07-26") });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c97ae5f330fd0aa0d2fe4a1")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.addCurrentDateTimeDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c97ae45330fd0aa0d2fe49f"),
"StudentName" : "John",
"StudentAdmissionDate" : ISODate("2012-01-21T00:00:00Z")
}
{
"_id" : ObjectId("5c97ae54330fd0aa0d2fe4a0"),
"StudentName" : "Carol",
"StudentAdmissionDate" : ISODate("2013-05-24T00:00:00Z")
}
{
"_id" : ObjectId("5c97ae5f330fd0aa0d2fe4a1"),
"StudentName" : "Carol",
"StudentAdmissionDate" : ISODate("2019-07-26T00:00:00Z")
}3. $setOnInsert로 현재 날짜 시간 삽입하기
이제 현재 날짜와 시간을 삽입하는 쿼리를 살펴보겠습니다. 새로운 학생 레코드를 추가하면서, 그 문서 안에 현재 날짜 시간을 함께 기록합니다.
> db.addCurrentDateTimeDemo.update(
{ _id: 1 },
{ $set: { StudentName: "Robert" }, $setOnInsert: { StudentAdmissiondate: new Date() } },
{ upsert: true }
);
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1 })여기서 upsert: true 옵션은 조건에 일치하는 문서가 없을 경우 새 문서를 자동으로 생성하는 역할을 합니다. 이 예제에서는 _id가 1인 문서가 존재하지 않았기 때문에(nMatched: 0), 새 문서가 삽입되었고(nUpserted: 1), 이때 $setOnInsert에 지정한 현재 날짜 시간이 함께 기록되었습니다.
4. 삽입 결과 검증하기
현재 날짜 시간이 정상적으로 삽입되었는지 확인하려면 다시 모든 문서를 조회해 봅니다.
> db.addCurrentDateTimeDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c97ae45330fd0aa0d2fe49f"),
"StudentName" : "John",
"StudentAdmissionDate" : ISODate("2012-01-21T00:00:00Z")
}
{
"_id" : ObjectId("5c97ae54330fd0aa0d2fe4a0"),
"StudentName" : "Carol",
"StudentAdmissionDate" : ISODate("2013-05-24T00:00:00Z")
}
{
"_id" : ObjectId("5c97ae5f330fd0aa0d2fe4a1"),
"StudentName" : "Carol",
"StudentAdmissionDate" : ISODate("2019-07-26T00:00:00Z")
}
{
"_id" : 1,
"StudentAdmissiondate" : ISODate("2019-03-24T16:21:21.269Z"),
"StudentName" : "Robert"
}위 출력 결과에서 확인할 수 있듯이, 새로 삽입된 문서에는 현재 날짜 시간인 "2019-03-24T16:21:21.269Z"가 정상적으로 기록되었습니다.
정리
$setOnInsert 연산자는 upsert 작업 시 문서가 새로 생성되는 순간에만 동작하기 때문에, 기존 문서가 수정될 때는 값이 변경되지 않는다는 장점이 있습니다. 따라서 레코드의 생성 일시(createdAt)처럼 최초 삽입 시점의 타임스탬프를 안전하게 보존해야 하는 경우에 매우 적합한 방법입니다.