作为我在MongoDB中的文档的一部分,我正在存储一个对象数组。例如,如何仅查询数组的第4个元素?所以我不希望得到整个数组,只是第4个元素。
答案 0 :(得分:58)
使用$slice
。
db.foo.find({ bar : "xyz" } , { my_array : { $slice : [n , 1] } } )
将检索foo集合中bar =“xyz”的所有文档的数组“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/Retrieving+a+Subset+of+Fields
答案 1 :(得分:8)
另一种方法是使用更新数组语法。在此处,contribs.1
将contribs
数组中的第二个元素设置为值ALGOL 58
(取自manual page on update syntax)
db.bios.update(
{ _id: 1 },
{ $set: { 'contribs.1': 'ALGOL 58' } }
)
答案 2 :(得分:8)
您可以使用MongoDB 3.2中的$arrayElemAt
运算符new来返回指定数组索引处的元素。
演示:
名为 baskets 的集合包含如下所示的文档:
{
"_id" : ObjectId("578f326f6db61a299a383c5a"),
"fruits" : [
"apple",
"mango",
"banana",
"apricot",
"cherry"
]
}
以下查询返回" fruits"中的索引-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"
}