如何将文档附加到子文档数组中 - Java / MongoDB

时间:2017-02-09 02:28:27

标签: java arrays mongodb

如何使用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}]}  
          ]     
}

更新

抱歉,我没有正确解释,推文文件是tweetsId数组。我修复了上面的例子,以便更好地理解。

例如,只有2个级别的集合:

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

我可以使用以下命令将新的TweetId附加到此数组:

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

但是当阵列处于3级(小时>推文> TweetId)时,我找不到正确的方法。

希望现在能更好地解释一下。

2 个答案:

答案 0 :(得分: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

  

$ push运算符将指定值附加到数组。

您可以下载MongoDB Java Driver,然后阅读java doc尝试与java。

当您遇到困难时,请仔细阅读文档并进行谷歌搜索,如果仍然无效,请显示无效的特定代码。

希望这有帮助。

答案 1 :(得分:0)

利用Riccardo发送的提示,我看看如何使用聚合功能,并且能够获得我需要的结果而无需按小时创建推文集合。

我使用了包含所有推文及其详细信息的集合,并使用下面的函数,能够检索数据:

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}]
]