반응형

제목 그대로의 상황이다.

방치해둔 서버의 용량이

각종 로그와 aws관련 버저닝 파일들로 인해 100%가 되어버렸다.

 

mongo는 더이상 저장이 불가능하자

다운되어 버렸다.

 

나중에 서버의 용량을 확보했지만

이미 다운된 몽고는 돌아오지 않았다.

 

다양한 방법의 실행 끝에

아래와 같은 방법을 통해 해결했다.

 

1. 로그 확인

/var/log/mongodb/mongod.conf

 

위 경로에서 로그를 확인할 수 있다.

 

나는 아래와 같은 에러 로그들을 볼수있었따.

WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
Failed to start up WiredTiger under any compatibility version.
Reason: 13: Permission denied

 

mongo, mongo status 체크를 할때도

아래와 같은 로그를 확인했었다.

Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused

 

2. 해결책

의외로 해결책을 한 한국인 분의 블로그에서 확인할 수 있었다.

chown -R mongodb:mongodb /var/lib/mongodb
chown mongodb:mongodb /tmp/mongodb-27017.sock

 

재실행

systemctl restart monogd
 
상태 확인
systemctl status mongod

mongo
 
반응형
반응형

NoSQL을 다루다보면 제목과 같은 일이 제법 빈번히 발생한다.

const ProductSchmea = new mongoose.Schema({
  ...
  comments: [
  	{
      userId: ...,
      comment: ...,
      createdAt: ...,
      updatedAt: ...,
    }
  ]
});

 

위와 같은 설계를 하는일이 제법 많기때문이다.

상품에 대한 댓글을 위처럼 관리하면 매우 쉽기 때문이다.

그런데 comments를 수정하려면 어떻게 할까...? 가 문제다.

 

먼저, comments를 추가하는것은 제법 간단하다.

...
try {
  const commentInfo = {
    userId: ...,
    comment: ...,
  };
  
  await Prodcut.findOneAndUpdate({ _id: id }, { $push: { comments: commentInfo } }).exec();
} catch(error) {
  ...
}
...

이런식으로 push해서 넣으면 끝..!

 

대망의 수정이다.

알고나면, ? 쉽네 뭐야 어떻게 된거지? 라고 할만큼 쉽다.

하지만, 모르면 도저히 그 방법을 찾을수가없다.

 

...

try {
  await Product.findOneAndUpdate(
    { _id: id, 'comments._id': commentId }, 
    { $set: { 'comments.$.comment': '수정해버림' } 
  }).exec();
  
} catch(error) {
  ...
}

...

포인트는 두가지이다.

1. comment._id를 알아야한다는 것.

2. comments.$.comment

여기서 .$은 javascript의 [n]을 대신해준다.

 

위의 정보는 은근히 찾기 어려워 이렇게 간단히 주석을 남긴다.

반응형

'개발, 코딩 > RDB|SQL|NoSQL' 카테고리의 다른 글

Mongo, $project에서 array타입 null체크하여 처리하기  (0) 2020.04.21
$text - mongo  (0) 2020.04.07
react-native, webview 마스터  (0) 2019.11.19
mongodb, 배열처리하기  (0) 2019.11.19
AWS, s3 이미지 업로드  (0) 2019.11.19
반응형

NoSQL에서 배열은 DB의 자료형으로써 매우 자주 쓰이는 편입니다.

 

어떻게 array에 특정 조건을 걸어서 값을 필터링하는지 간단히 살펴보겠습니다.

 

* 키워드는 elemMatch

const filtered_examples = await ExampleCollection.aggregate([
	{
		$lookup: {
			from: 'joinedCollection',
			localField: 'localField,
			foreignField: 'joinedCollectionField',
			as: 'retunName',
		},
	},
	{
		$match: {
			examples: { $elemMatch: { name: 'johndoe' } },
		},
	},
])

 

반응형
반응형

* Null field 어떻게 조건식에 넣지?

NoSql에서 쿼리문을 짜다보면 종종 필드값을 갖지않은 컬렉션을 골라내야할 때가 있습니다.

그때를 위해 간단히 알아보도록 하겠습니다.

 

Case 1:

// 필드가 존재하지 않거나, 필드의 값이 null인 것
db.inventory.find( { item: null } )

 

Case 2:

// field가 존재하지 않는 것
db.inventory.find( { item : { $exists: false } } )

 

반응형
반응형

* 몽고디비에서 날짜 필터링

await SomethingCollection.find({
    createdAt: {
    	$gte: moment().startOf('month').toDate(),
        $lt: moment().endOf('month').toDate(),
    },
}).exec();

여기서는 moment.js를 함께 사용하였습니다.

$gte는 from,

$lt는 to 의 역할을 한다.

 

시간을 핸들링 할 필드값이 따로 있다면, createAt 외의 다른 필드를 사용해도 무방합니다.

 

반응형