2017-11-21 8 views
1

MongoDB私は具体的には、単一のdbクエリで配列内の最後のオブジェクトのキー値を照会できる方法はありますか?MongoDB - 配列の最後のオブジェクトを照会しますか?

例:これはコレクション内の私のドキュメントです。あなたが見ることができるように

{"com" : [ { "ts" : 1510830164203, "com" : "com1" }, { "ts" : 1511242569673, "com" : "connected" },{ "ts" : 1511244832741, "com" : "vb" } ],"status" : [ { "ts" : 1510857000000, "stat" : 3 } ] } 

だからコム内に複数のオブジェクトがあります。 最後のオブジェクトのt(タイムスタンプ)を照会するか、またはチェックしたいのは、今日の日付の間に最後に挿入されたものです。

私はすでにこれを行っていますlink.しかし、適切な解決策が見つかりませんでした。

何か助けを得ることができます。

答えて

1

$arrayElemAtを使用して最後の要素を取得し、aggregationに適用して一致させることができます。 $arrayElemAtを使用して最後の要素を取得するには、配列の最後の要素を示す第2の値-1を使用します。 $arrayElemAt: ["arrayName", -1]。コードは

db.collectionName.aggregate([ 
    { 
    $project: { 
     status: 1, 
     com: {$arrayElemAt: ["$com", -1]} 
    } 
    }, 
    { 
    $match: {"com.ts": 15115465465} 
    } 
]) 

NBのようになります:$lt, $lte, $gt, or $gteあなたが

$match: {"com.ts": {$lt: 15115465465}} 
+0

はい、私は考える必要がある任意の1:あなたのような、その後使用よりも、より少ない以上のように比較する場合これはトリックを行うことができます。しかし、ただ一つ教えてください。このクエリはどれくらい重いですか?私は、この種のクエリをより頻繁に使用しなければならないということです。私はこれが正しい問題を引き起こさないことを願っていますか? –

+0

はい、それは重いクエリ、単純なクエリではありません –

+0

さて、ありがとう:) –

0
var d1 = new Date(parseInt("Today at 12:00 AM", 16) * 1000) 
var d2 = new Date(parseInt("Tomorrow at 12:00 AM", 16) * 1000) 

db.table.find(
    { com: { $elemMatch: {ts:{ $gte: d1, $lt: d2 } } } }) 
) 
+0

私たちは最後のオブジェクトのキーに使用できますか?つまり、配列全体を検索します。 –

+0

いいえ、最後のオブジェクトのキーの条件を満たすオブジェクトのみが必要です –

+0

結果は、今日の日付の条件を満たすすべてのオブジェクトを返します。 max()集計を最大ts(最大値が最大であると仮定)にすることができます。または、次を適用することができます:db.table.find( {$ { .limit(1) –

0
db.collection.aggregate(

    // Pipeline 
    [ 
     // Stage 1 
     { 
      $match: { 
      "_id" : ObjectId("5a197a3bde472b16ed9fc28d") 
      } 
     }, 

     // Stage 2 
     { 
      $unwind: { 
       path : "$com" 
      } 
     }, 

     // Stage 3 
     { 
      $sort: { 
      'com.ts':-1 
      } 
     }, 

     // Stage 4 
     { 
      $limit: 1 
     } 

    ] 



); 
関連する問題