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 from
MongoDB에 있습니다.먼저 여러 문서를 문서 배열로 변환한 후 대상 컬렉션에 배열을 삽입합니다.
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
'programing' 카테고리의 다른 글
nginx가 있는 워드프레스 색인에서는 403이 금지되어 있으며, 나머지 페이지는 정상적으로 동작합니다. (0) | 2023.02.21 |
---|---|
Python JSON 덤프 / .txt에 추가 (각 변수 새 줄에 포함) (0) | 2023.02.21 |
ajax call php를 통해 파일 다운로드 (0) | 2023.02.21 |
부트스트랩 카르셀 크기 조정 이미지 (0) | 2023.02.21 |
Google Maps API는 AJAX를 사용할 때만 "Uncatched ReferenceError: google is not defined"를 발생시킵니다. (0) | 2023.02.21 |