2017-07-14 3 views
1

したがって、配列の型に設定されたフィールドを持つコレクションを持つmongoデータベースがあります。long型を含まないMongo dbコレクション内のすべてのドキュメントを配列に戻し、それらの要素の型を変更する方法

{ 
    "_id" : ObjectId("kdsfisdasg924837529dsfhk"), 
    "myArr" : [ 
     123456 
    ] 
} 

私は、このコレクションを照会し、長期のデータ型にmyArrセット内の要素を持っていないすべての文書を、見つけるために探しています。私は掘り下げていましたが、解決策を参照するものは何も見つかりませんでした。私は次のようなものを試していました: db.myCollection.find({myArr: {$not: {$type: "long"}}},{myArr:1, _id: 0})

私が.count()を渡すと、多数の文書が返されます。私が知っているほとんどすべてのコレクションの文書数は間違っています。私は$notを間違って使用していると思います。私の構文は間違っていますか?これを解決する別のアプローチがありますか?

UPDATE

私は私が使用してタイプlongの要素を除いた配列を持つ文書を見つける問題を解決したと考えている:db.myCollection.find({myArr: {$elemMatch: {$not: {$type: "long"}}}}, {myArr:1, _id: 0})。どのようにして、すべての要素の種類を変更したり変更したりするのですか?long? Refernce

Imはかなり近い取得するための

。私は上記の関数で返されたドキュメント内の配列thatsを反復処理するために書いたこの関数を変更できると信じています。

db.myCollection.find({myArr: {$elemMatch: {$not: {$type: 18}}}}).forEach(function(myDoc){ 
    for(var i =0; i < myDoc.myArr.length; i++){ 
     print(typeof myDoc.myArr[i]); 
    } 
}); 
+0

私は '$のexists'と' $ないでAND演算試みた:$タイプ:だけでなく ' "未定義" を、それは私が私が私の解決策を見つけたと信じて同じ'カウント数() ' – mahbad

+0

を返しました。'db.myCollection.find({myArr:{$ not:{$ type:" long}}}}} {{myArr:}}配列要素を反復するために、 1、_id:0})。count() ' – mahbad

答えて

0

WHA!とった! Simone'sGatesVP's答えhere

db.myCollection.find({myArr: {$elemMatch: {$not: {$type: 18}}}}).forEach(function(myDoc){ 
    for(var i =0; i < myDoc.myArr.length; i++){ 
     myDoc.myArr[i] = NumberLong(myDoc.myArr[i]); 
     db.transactions.save(myDoc); 
    } 
}); 

のおかげで、私はMongoDBののコンパスGUIクライアントを使用してダブルチェックし、それがmyArrのすべてのインスタンスが、今、その要素でlong値しか含まれていません示しています。また、CLIクライアントのfind$notロジックを削除して、データの値が保持されていることを確認しました。見栄えが良い。また、各文書の構造を調べるために、findコマンドの最後の3つの結果についてjsonを表示しました。

db.myCollection.find({myArr: {$elemMatch: {$type: 18}}}).sort({$natural: -1}).limit(3).forEach(printjson); 
関連する問題