2017-02-09 13 views
-1

JavaでMongoDBのサブ文書配列に新しい文書を追加するにはどうすればよいですか? exempleについてサブ文書配列に文書を追加する方法 - Java/MongoDB

、{tweetIdを:456}追加ドキュメントの配列に "ツイート":

{ 
    day : 20170209, 
    hours : { 
      hour : 20, 
      tweets : {tweetId : 123 } 
      }  
} 

所望の結果:

{ 
    day : 20170209, 
    hours : [ {hour : 20, 
      tweets : [{tweetId : 123},{tweetId : 456}]}, 
      {hour : 21, 
      tweets : [{tweetId : 567},{tweetId : 890}]} 
      ]  
} 

UPDATE

は申し訳ありませんが、私はなかったの正しく説明すると、つぶやき文書はツイートの配列です。私はより良い理解に上記の例を修正しました。

{ 
    "_id":{ 
     "$oid":"589c5a1047e9062f004b84a3" 
    }, 
    "hashtag":"BRASIL", 
    "tweets":[ 
     { 
     "tweetId":"829661297121845249" 
     }, 
     { 
     "tweetId":"829661278352269313" 
     } 
    ] 
} 

私は、この配列に新しいTweetIdを追加することができます:唯一の2レベルのコレクションで例えば

collection.updateOne(new Document("hashtag", hashtag), 
        new Document("$push", new Document("tweets", new Document("tweetId", tweetId)))); 

しかし、アレイは、レベル3(時間であります>ツイート> TweetId)、私はそれを正しく行う方法を見つけることができません。

今はもっとうまく説明されています。

+0

私はあなたのように、モンゴで時系列を実装しようとしているとし「MongoDBにおける時系列の実装」(https://dzone.com/articles/implementing-time-series-in-mongodb)で説明されています。しかし、これは正しい方法ではありません。データベースがメモリ上でドキュメントの移動を開始しないようにするには、ドキュメントの長さを固定する必要があります。次に、配列を使用しないでください。 –

+0

こんにちは、リカルド。実際には、つぶやきを1時間ごとに整理しようとしています。 –

+0

使用しているドキュメントスキーマが正しいことを確認してください。つまり、*ハッシュタグ*の場合は、1つの配列で足が足りない数百万のつぶやきを持つことができます。ドキュメントはMongoDBで最大サイズを持っていることに注意してください。私は、ハットタグのリストを使って、ツイートごとにドキュメントを用意することをお勧めします。次に、Aggregation Frameworkを使用して適切に動作させます。 –

答えて

0

リッカルドのヒントを送って、アグリゲーション機能の使い方を見て、つぶやきのコレクションを1時間ごとに作成せずに必要な結果を得ることができました。

私はその詳細を持つすべてのつぶやきを持っていたコレクションを使用して、以下の機能で、データを取り出すことができた:ツイートの

tweetsCol.aggregate([ 
        {$group: {_id : {Date : "$date", Hour : '$hour'}, Total : {$sum : 1}}} 
        ]) 

私のコレクションには、以下の情報を持っています

"tweetId" : String, 
"userId" : String, 
"username" : String, 
"followers" : String, 
"language" : String, 
"fulldate" : String, 
"date" : String, 
"hour" : String, 
"text" : String, 
"hashtags" : [{ 
    "tweetId" : String 
}] 

クエリ結果:

[{Date : 20170209, 
hours : [{hour : 21, Total: 45}, 
      {hour : 22, Total: 22}]}, 
{Date : 20170210, 
hours : [{hour : 11, Total: 38}, 
      hour : 17, Total : 71}] 
] 
0

{tweetId : 123, tweetId : 456}のような辞書を設定することはできません。複数のキーは不正です。これは配列ではありません。

私はあなたがあなたの文書構造を再設計提案、多分この文書構造は、あなたがしたいです:

tweets : [ 
{ 
    tweetID:123, 
    text:"Hello", 
    date:"2017-01-31-09-01-01" 
    }, 
{ 
    tweetID:456, 
    text:"Hi", 
    date:"2017-01-31-09-01-01" 
    } 
] 

配列に要素を追加するには、あなたが$pushを使用することができます。

$プッシュ演算子は、A追加指定された値を配列に追加します。

あなたはMongoDB Java Driverをダウンロードしjava docのjavaで試しを持って読むことができます。

この問題が発生した場合は、慎重に文書を読んでみてください。まだ動作しない場合は、動作していない特定のコードを表示してください。

希望します。

+0

こんにちは、McGrady。ご回答有難うございます。私がしようとしているのは、1日の時間帯にすべてのtweetIdsを含むコレクションを作成することです。 –

+0

@PedroGrandi MongoDBドキュメントを読んでください。また、[mongodb push in nested array](http://stackoverflow.com/questions/27874469/mongodb-push-in-nested-array)を参照してください。試してみてください。 – McGrady

+0

私はこの文書を読んでgoogleをたくさん読んでいます。それは、新しい文書をレベル2(ハッシュタグの例のようなもの)のときに配列にプッシュする方法です。しかし、問題は、配列がレベル3(day> hour> tweets>のような場合)です。 –

関連する問題