programing

MongoDB 컬렉션 서브셋을 다른 컬렉션에 저장

starjava 2023. 2. 21. 23:17
반응형

MongoDB 컬렉션 서브셋을 다른 컬렉션에 저장

나는 이런 세트가 있다.

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

'20120105' 날짜의 일부 문서를 다른 컬렉션에 저장하려면 어떻게 해야 합니까?

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

집약 프레임워크를 사용하는 것이 좋습니다.

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

동작 속도가 100배 이상 빠릅니다.forEach적어도 제 경우에는요.이는 전체 어그리게이션 파이프라인이 mongod 프로세스에서 실행되는데 반해 솔루션은 다음을 기반으로 하기 때문입니다.find()그리고.insert()는 서버에서 클라이언트로 모든 문서를 전송한 후 되돌려야 합니다.서버와 클라이언트가 같은 머신상에 있는 경우에서도, 퍼포먼스가 저하됩니다.

셸 버전은 다음과 같습니다.

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

주의: MongoDB 2.6 에서는 집약 프레임워크에 의해 이 작업이 고속화됩니다.자세한 내용은 melan의 답변을 참조하십시오.

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

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 ....

네가 알아서 처리해관심 문서를 가져와 다른 모음에 저장합니다.

셸에서 할 수 있지만, 저는 루비에서 작은 외부 스크립트를 사용합니다.다음과 같은 경우:

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 연산자와 함께 aggregate를 사용하여 서브셋을 새로운 컬렉션에 저장할 수 있습니다.자세한 내용은 다음과 같습니다.

$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" ] }

질문된 질문에서 다음 쿼리를 사용하면 데이터베이스에 'col_20120105'라는 이름의 새 컬렉션을 얻을 수 있습니다.

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

$merge 집약 파이프라인 스테이지를 사용할 수도 있습니다.

db.full_set.aggregate([
  {$match: {...}},
  { $merge: {
     into: { db: 'your_db', coll: 'your_another_collection' },
     on: '_id',
     whenMatched: 'keepExisting',
     whenNotMatched: 'insert'
  }}
])

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

반응형