2016-04-05 7 views
1

サブ文書の配列を所有者のIDで管理された独自のコレクションに移動しようとしています。現在、私のコレクションは、このように形成されている:MongoDBサブ文書の配列を自身のコレクションに移動

"_id": ObjectId("123"), 
"username": "Bob Dole", 
"logins": [{ 
    "_id": ObjectId("abc123"), 
    "date": ISODate("2016") 
}, { 
    "_id": ObjectId("def456"), 
    "date": ISODate("2016") 
}] 

私は、各ユーザをループするスクリプトを書き、それ自身の「ログイン」コレクションへのログインの配列内の各アイテムを移動するための最良の方法を探しています

{ 
    "_id": ObjectId("abc123"), 
    "_ownerId": ObjectId("123"), 
    "date": ISODate("2016") 
} 
{ 
    "_id": ObjectId("def567"), 
    "_ownerId": ObjectId("123"), 
    "date": ISODate("2016") 
} 

スクリプトが終了したら、ログインアレイをすべてのユーザーから完全に削除したいと思います。

+0

Iあなたの新しいコレクションのあなたの配列から要素を見ることができませんでした – styvane

+0

_ownerIdのソースは何ですか? - それは私にとっては明らかではありません。 – profesor79

+0

@ user3100115ありがとうございました。 – ThinkingInBits

答えて

2

このクエリは、それがどのように見えるかを確認するために集約フレームワーク を使用して新しいコレクションを作成します - ちょうど配列のレコードを削除する$アウトパイプライン・フェーズ

db.thinking.aggregate([ 
{ 
    $unwind:"$logins" 
},{ 
    $project:{ 
     _id:"$logins._id", 
     _ownerId:"$_id", 
     date:"$logins.date" 
    } 
}, 
{ 
    $out: "newCollection" 
} 
]) 

を削除 - コメントで提案されているように:

db.thinking.update({},{ "$unset": { "logins": "" } },{ "multi": true }) 
+1

** $ outは**新しい**コレクションの "サブ文書"にとっては良い選択ですが、実際にはそれを使用してマスターコレクションを再編成してはいけません。あなたは** "ソース"と同じコレクション名を "上書き"することはできません。その結果、 "別のコレクション"になります。とにかく 'db.thinking.update({}、{" $ unset ":{"ログイン ":"}}、{"マルチ":true}) 'は** far **より効率的です。 "ソース"を直接。 –

+0

@Neil Lunnはヒントのおかげで、私は集約フレームワークについて少し狂っていることがわかります – profesor79

関連する問題