2017-03-13 5 views
0

mongodbに質問が1つあります。 例:mongdbの配列をカスタマイズする方法

"times" : [ 
     { 
      "start" : first_date, 
      "end" : ISODate("2017-03-10T12:00:00.000Z") 
     }, 
     { 
      "start" : ISODate("2017-03-10T14:00:00.000Z"), 
      "end" : ISODate("2017-03-10T18:10:00.000Z") 
     }, 
     { 
      "start_time" : ISODate("2017-03-11T08:00:00.000Z"), 
      "end" : last_date 
     } 
    ], 

これは最新のドキュメントです。 このような文書を作成したい

"times" : { 
       "start" : first_date, 
       "end" : last_date 
      }, 

どうすればいいですか?

+0

使用配列 – radhakrishnan

+0

を分解するために$のアンワインド演算子を使用すると、スキーマを変更しますか、またはあなたは「回」が必要です。データベースからそれをフェッチしている間に{LAST_DATE 「開始」:first_date、 「終了」} – karthick

+0

データベースからフェッチする際に必要です –

答えて

0

あなたは集計の下に試すことができます。

$projectの最初と最後のtimesの値の後に、もう一方の$projectを使用して開始時刻と終了時刻を指定します。

db.collection.aggregate([ 
    {$project:{first:{$arrayElemAt: ["$times", 0]}, 
       last:{$arrayElemAt: ["$times", -1]}}}, 
    {$project:{_id:0, "times.start":"$first.start", "times.end":"$last.end"}}]) 

あなたは$arrayAtElem$project一段の値から、結果を保持するために$let演算子を使用することができます。

db.collection.aggregate([ 
    {$project:{"times.start":{$let: {vars: {obj: {$arrayElemAt: ["$times", 0]}}, 
     in: "$$obj.start"}}, 
      "times.end":{$let: {vars: {obj: {$arrayElemAt: ["$times", -1]}}, 
     in: "$$obj.end"}} 
}}]) 
+0

恐ろしい、ありがとう –

0

あなたは、このようにしてみてください。..

 db.collection.aggregate([{ 
      "$unwind": "$times" 
     }, { 
      $project: { 
       _id: 0, 
       times: 1 
      } 
    }]) 
+0

これは私が必要とするものではありません。それは_id上の時間フィールドのベースのみを区切ります。 –

関連する問題