40

MongoDB のドキュメントの一部として、オブジェクトの配列を格納しています。たとえば、配列の4番目の要素のみを照会するにはどうすればよいですか? したがって、配列全体を取得するのではなく、4番目の要素だけを取得したくありません。

4

3 に答える 3

68

を使用し$sliceます。

db.foo.find({ bar : "xyz" } , { my_array : { $slice : [n , 1] } } )

bar="xyz"であるfooコレクション内のすべてのドキュメントの配列"my_array"のn番目の要素を取得します。

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/Retrieveing+a+Subset+of+Fields

于 2011-08-28T20:26:39.193 に答える
16

$arrayElemAtMongoDB 3.2 の new 演算子を使用して、指定した配列インデックスの要素を返すことができます。


デモ:

バスケットという名前のコレクションには、次のようなドキュメントが含まれています。

{
    "_id" : ObjectId("578f326f6db61a299a383c5a"),
    "fruits" : [
        "apple",
        "mango",
        "banana",
        "apricot",
        "cherry"
    ]
}

-2次のクエリは、"fruits" 配列のindex の要素 (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" 
}
于 2016-07-20T08:24:22.650 に答える
9

これを行う別の方法は、更新配列構文を使用することです。ここでは、配列contribs.1の 2 番目の要素に値を設定します(更新構文のマニュアル ページから取得) 。contribsALGOL 58

db.bios.update(
   { _id: 1 },
   { $set: { 'contribs.1': 'ALGOL 58' } }
)
于 2013-08-05T18:22:12.573 に答える