web-dev-qa-db-ja.com

MongoDB-配列の最後の要素に対するクエリ?

MongoDBはfind{array.0.field:"value"}構文をサポートしていることは知っていますが、特に配列の最後の要素に対してこれを行いたいので、インデックスがわかりません。これに何らかの演算子がありますか、それとも運が悪いのですか?

編集:明確にするために、配列の最後の要素のフィールドが特定の値と一致するドキュメントのみをfind()に返すようにします。

24
Joseph Blair

私は公式のMongo Googleグループに投稿しました こちら 、スタッフから回答を得ました。私が探しているものは不可能なようです。別のスキーマアプローチを使用するだけです。

13
Joseph Blair

3.2ではこれが可能です。 myFieldに最後の要素のみが含まれるように最初にプロジェクトを作成し、myFieldで一致させます。

db.collection.aggregate([
   { $project: { id: 1, myField: { $slice: [ "$myField", -1 ] } } },
   { $match: { myField: "myValue" } }
]);
21
jdeyrup

$ sliceを使用します。

db.collection.find( {}, { array_field: { $slice: -1 } } )

編集:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }を使用して一致を見つけることができます。

しかし、それはあなたが探しているものを正確には与えません。私はそれがmongoDBでまだ可能だとは思わない。

12
Kaushal

$ expr (3.6 mongo version operator)を使用して、通常のクエリで集計関数を使用できます。

比較 query operators vs aggregation comparison operators

スカラー配列の場合

db.col.find({$expr:{$gt:[{$arrayElemAt:["array", -1]}, value]}})

埋め込み配列の場合- $arrayElemAt 最後の要素を投影するドット表記の式。

db.col.find({$expr:{$gt:[{"$arrayElemAt": ["$array.field", 0]}, value]}})

@Queryコード

@Query("{$expr:{$gt:[{$arrayElemAt:[\"array\", -1]}, ?0]}}")
ReturnType MethodName(ArgType arg);
8
user2683814

パフォーマンスについてはわかりませんが、これは私にとってはうまくいきます:

db.getCollection('test').find(
  {
    $where: "this.someArray[this.someArray.length - 1] === 'pattern'"
  }
)
7
Ramil Muratov

$position: 0$Push、常にクエリarray.0最後に追加された要素を取得します。もちろん、新しい「最後の」要素を取得することはできません。

5
Ricky

バージョン3.6集約を使用して同じことを実現します。

db.getCollection('deviceTrackerHistory').aggregate([
   {
     $match:{clientId:"12"}
   },
   {
     $project:
      {
         deviceId:1,
         recent: { $arrayElemAt: [ "$history", -1 ] }
      }
   }
])
4
KARTHIKEYAN.A