MongoDBのドキュメントの一部として、オブジェクトの配列を保存しています。たとえば、配列の4番目の要素のみをクエリするにはどうすればよいですか?したがって、配列全体を取得するのではなく、4番目の要素だけを取得する必要があります。
使用する $slice
。
db.foo.find({ bar : "xyz" } , { my_array : { $slice : [n , 1] } } )
fooコレクション内のすべてのドキュメントの配列「my_array」のn番目の要素を取得します(bar =「xyz」)。
MongoDBドキュメントのその他の例:
db.posts.find({}, {comments:{$slice: 5}}) // first 5 comments
db.posts.find({}, {comments:{$slice: -5}}) // last 5 comments
db.posts.find({}, {comments:{$slice: [20, 10]}}) // skip 20, limit 10
db.posts.find({}, {comments:{$slice: [-20, 10]}}) // 20 from end, limit 10
ここで読むことができます: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields
MongoDB 3.2の新しい $arrayElemAt
演算子を使用して、指定された配列インデックスの要素を返すことができます。
デモ:
basketsという名前のコレクションには、次のようなドキュメントが含まれています。
{
"_id" : ObjectId("578f326f6db61a299a383c5a"),
"fruits" : [
"Apple",
"mango",
"banana",
"apricot",
"cherry"
]
}
次のクエリは、「fruits」配列のインデックス-2
(2番目の要素)の要素を返します。
db.baskets.aggregate(
[
{ "$project": { "matched": { "$arrayElemAt": [ "$fruits", 1 ] } } }
]
)
生産する
{
"_id" : ObjectId("578f326f6db61a299a383c5a"),
"matched" : "mango"
}
また、次の例では、配列の最後の要素の前の要素を照会しています。したがって、インデックス-2
の要素
db.baskets.aggregate(
[
{ "$project": { "matched": { "$arrayElemAt": [ "$fruits", -2 ] } } }
]
)
生成されるもの:
{
"_id" : ObjectId("578f326f6db61a299a383c5a"),
"matched" : "apricot"
}
これを行う別の方法は、更新配列構文を使用することです。ここで、contribs.1
はcontribs
配列の2番目の要素に値ALGOL 58
を設定します( 更新構文のマニュアルページ から取得)
db.bios.update(
{ _id: 1 },
{ $set: { 'contribs.1': 'ALGOL 58' } }
)