MongoDBはfind{array.0.field:"value"}
構文をサポートしていることは知っていますが、特に配列の最後の要素に対してこれを行いたいので、インデックスがわかりません。これに何らかの演算子がありますか、それとも運が悪いのですか?
編集:明確にするために、配列の最後の要素のフィールドが特定の値と一致するドキュメントのみをfind()に返すようにします。
私は公式のMongo Googleグループに投稿しました こちら 、スタッフから回答を得ました。私が探しているものは不可能なようです。別のスキーマアプローチを使用するだけです。
3.2ではこれが可能です。 myFieldに最後の要素のみが含まれるように最初にプロジェクトを作成し、myFieldで一致させます。
db.collection.aggregate([
{ $project: { id: 1, myField: { $slice: [ "$myField", -1 ] } } },
{ $match: { myField: "myValue" } }
]);
$ sliceを使用します。
db.collection.find( {}, { array_field: { $slice: -1 } } )
編集:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
を使用して一致を見つけることができます。
しかし、それはあなたが探しているものを正確には与えません。私はそれがmongoDBでまだ可能だとは思わない。
$ 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);
パフォーマンスについてはわかりませんが、これは私にとってはうまくいきます:
db.getCollection('test').find(
{
$where: "this.someArray[this.someArray.length - 1] === 'pattern'"
}
)
$position: 0
$Push
、常にクエリarray.0
最後に追加された要素を取得します。もちろん、新しい「最後の」要素を取得することはできません。
バージョン3.6集約を使用して同じことを実現します。
db.getCollection('deviceTrackerHistory').aggregate([
{
$match:{clientId:"12"}
},
{
$project:
{
deviceId:1,
recent: { $arrayElemAt: [ "$history", -1 ] }
}
}
])