2016-05-12 9 views
0

に保存します。MongoDBのクエリの結果とは、例えば1

1.Usingが見つけ、テストする各コレクション:

var objIdMin = ObjectId(Math.floor((new Date('2016/05/01 00:00:00'))/1000).toString(16) + "0000000000000000"); 
var objIdMax = ObjectId(Math.floor((new Date('2016/05/11 00:00:00'))/1000).toString(16) + "0000000000000000"); 

db.getCollection('google').find({ _id:{$gt: objIdMin, $lt: objIdMax}, 'result.text':/phone/}).count(); 

Googleの収集結果数が50

db.getCollection('apple').find({ _id:{$gt: objIdMin, $lt: objIdMax}, 'result.text':/phone/}).count(); 

ですリンゴの収集結果の数は100です。

2.私は私の目的を達成するために回って:

var cols = db.getCollectionNames(); 
var objIdMin = ObjectId(Math.floor((new Date('2016/05/01 00:00:00'))/1000).toString(16) + "0000000000000000"); 
var objIdMax = ObjectId(Math.floor((new Date('2016/05/11 00:00:00'))/1000).toString(16) + "0000000000000000"); 

var cols_in = ['google', 'apple']; 
for (var i=0; i<cols_in.length; i++){ 
    db.getCollection(cols_in[i]).aggregate([ { $match: { _id:{$gt: objIdMin, $lt: objIdMax}, 'result.text':/phone/}}, { $out: "target" } ]); 
}; 

これを解決する方法、target collectionの結果のカウントは(apple collectionと同じ)100に等しいので、後でコレクションは、前者が上書きされますか?

編集:コレクションは、集計が完了した時点で そして、操作がすでに存在している$うちで指定された場合は、既存のコレクション

を交換し

: 私はそれが原因にある見つけます$ outステージは、既存のコレクションを新しい結果コレクションに置き換えます( )。 $を実行しても、以前の コレクションに存在していたインデックスは変更されません。集計が失敗した場合、$ out操作は既存のコレクションへの変更を にしません。

唯一の方法は、すべてのレコードをforeachし、別のコレクションに挿入することですか?

答えて

0

コメントごとに - mongoにはUNION ALLがありません。多くのクエリの出力を1つの論理的な部分にマージすることができます。

そこらのためにコレクションを反復処理するために、あなたソリューションは非常に良いアプローチですが、すべてであなたが集約「出力」保存forループ内でこの問題を解決するためにあなたの例

ターゲットという名前の出力コレクションを上書きしている渡します配列として挿入し、挿入します。

怒鳴る切り取らご覧ください。

for (var i = 0; i < cols_in.length; i++) { 
    var documents = db.getCollection(cols_in[i]).aggregate([{ 
       $match : { 
        _id : { 
         $gt : objIdMin, 
         $lt : objIdMax 
        }, 

       } 
      } 
     ]).toArray(); 

     db.target.insert(documents) 
}; 
+0

私は、forループを使用せずに道を求めています。 – Mithril

+0

@ミスリル - 編集中 – profesor79

関連する問題