your programing

MongoDB 컬렉션의 하위 집합을 다른 컬렉션에 저장

lovepro 2020. 12. 26. 16:15
반응형

MongoDB 컬렉션의 하위 집합을 다른 컬렉션에 저장


나는 이렇게 세트가있다

{date: 20120101}
{date: 20120103}
{date: 20120104}
{date: 20120005}
{date: 20120105}

날짜가 '20120105'인 문서의 하위 집합을 다른 컬렉션에 저장하려면 어떻게해야합니까?

db.subset.save(db.full_set.find({date: "20120105"}));


다음은 셸 버전입니다.

db.full_set.find({date:"20120105"}).forEach(function(doc){
   db.subset.insert(doc);
});

참고 : MongoDB 2.6부터 집계 프레임 워크를 사용하면이 작업을 더 빠르게 수행 할 수 있습니다. 자세한 내용은 멜란의 답변 을 참조하십시오.


새로운 솔루션으로 문제에 대해 집계 프레임 워크를 사용하는 것이 좋습니다.

db.full_set.aggregate([ { $match: { date: "20120105" } }, { $out: "subset" } ]);

적어도 제 경우에는 forEach보다 약 100 배 빠르게 작동합니다. 전체 집계 파이프 라인이 솔루션을 기반으로, 반면 mongod 프로세스에서 실행되기 때문입니다 find()하고 insert()다시 다음 서버에서 클라이언트로 모든 문서를 전송하고 있습니다. 서버와 클라이언트가 동일한 시스템에 있더라도 성능이 저하됩니다.


실제로 insert into ... select fromMongoDB 에는 SQL과 동등한 것이 있습니다. 먼저 여러 문서를 문서 배열로 변환합니다. 그런 다음 배열을 대상 컬렉션에 삽입합니다.

db.subset.insert(db.full_set.find({date:"20120105"}).toArray())

가장 일반적인 해결책은 다음과 같습니다.

집계를 사용하십시오 (@melan이 제공 한 답변) :

db.full_set.aggregate({$match:{your query here...}},{$out:"sample"})
db.sample.copyTo("subset")

이는 작업 전에 "서브 세트"에 문서가 있고 "이전"문서를 보존하고 새 서브 세트를 삽입하려는 경우에도 작동합니다.

때문에 관리는주의해야 copyTo()명령은 같은과 문서를 대체합니다 _id.


SQL의 insert into ... select from ....

당신은 그것을 스스로 돌봐야합니다. 관심있는 문서를 가져 와서 다른 컬렉션에 저장합니다.

쉘에서 할 수 있지만 Ruby에서는 작은 외부 스크립트를 사용합니다. 이 같은:

require 'mongo'

db = Mongo::Connection.new.db('mydb')

source = db.collection('source_collection')
target = db.collection('target_collection')

source.find(date: "20120105").each do |doc|
  target.insert doc
end

Mongodb에는 새 컬렉션에 하위 집합을 저장할 수있는 $ out 연산자와 함께 집계가 있습니다. 다음은 세부 사항입니다.

$ out 집계 파이프 라인에서 반환 된 문서를 가져 와서 지정된 컬렉션에 씁니다.

  • $ out 작업은 아직없는 경우 현재 데이터베이스에 새 컬렉션을 만듭니다.
  • 집계가 완료 될 때까지 콜렉션이 표시되지 않습니다.
  • 집계에 실패하면 MongoDB는 컬렉션을 생성하지 않습니다.

구문 :

{ $out: "<output-collection>" }

컬렉션 책에는 다음 문서가 포함됩니다.

{ "_id" : 8751, "title" : "The Banquet", "author" : "Dante", "copies" : 2 }
{ "_id" : 8752, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 }
{ "_id" : 8645, "title" : "Eclogues", "author" : "Dante", "copies" : 2 }
{ "_id" : 7000, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 }
{ "_id" : 7020, "title" : "Iliad", "author" : "Homer", "copies" : 10 }

다음 집계 작업은 책 컬렉션의 데이터를 피벗하여 저자별로 제목을 그룹화 한 다음 결과를 저자 컬렉션에 기록합니다.

db.books.aggregate( [
  { $group : { _id : "$author", books: { $push: "$title" } } },
    { $out : "authors" }
] )

작업 후 작성자 컬렉션에는 다음 문서가 포함됩니다.

{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }

In the asked question, use following query and you will get new collection named 'col_20120105' in your database

 db.products.aggregate([
  { $match : { date : "20120105" } },
  { $out : "col_20120105" }
]);

ReferenceURL : https://stackoverflow.com/questions/9711529/save-subset-of-mongodb-collection-to-another-collection

반응형