40

作为我在 MongoDB 中的文档的一部分,我存储了一个对象数组。例如,如何仅查询数组的第 4 个元素?所以我不希望得到整个数组,只是第 4 个元素。

4

3 回答 3

68

使用$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

于 2011-08-28T20:26:39.193 回答
16

您可以使用$arrayElemAtMongoDB 3.2 中的 operator new 来返回指定数组索引处的元素。


演示:

一个名为baskets的集合包含如下所示的文档:

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

以下查询返回-2“fruits”数组中索引处的元素(第二个元素)。

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.1contribs数组中的第二个元素设置为具有值ALGOL 58(取自更新语法手册页

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