在集合中给出以下布局......
{
vehicle_id: 1
,// bunch of properties I don't want
,vehicle: {
mfg_year: 1928
,mfg_make: "Ford"
,mfg_model: "Model A"
,mfg_trim: "T-Bucket"
,// bunch of properties I don't want
,images: [
{url:'...',...}
,...
]
}
}
我如何只返回上述字段的结果,而只返回图像下的第一个结果?我不介意结果是否在一个展平对象中,只有图像是嵌套对象。
我查看了聚合框架,它似乎与我正在寻找的不匹配。我知道我可以在结果集上做map / reduce,或者在listing_id上做一个组,我只是希望有一个更简单的查询结构,而不需要诉诸组或减少。
如果目前无法通过聚合框架实现这一点,那么工作组或map-reduce将是可接受的答案。
答案 0 :(得分:5)
怎么样:
db.vehicles.find({"vehicle_id":1}, {images:{$slice: 1}})
示例强>
db.vehicles.insert({"vehicle_id": 1, "mfg_year": "1928", "mfg_make": "Ford", "mfg_model": "Model A", "images": [{"url":"www.a.com"}, {"url":"www.b.com"}, {"url":"www.c.com"}]})
db.vehicles.insert({"vehicle_id": 2, "mfg_year": "1999", "mfg_make": "BMW", "mfg_model": "Model B", "images": [{"url":"www.a.com"}, {"url":"www.b.com"}, {"url":"www.c.com"}]})
db.vehicles.insert({"vehicle_id": 3, "mfg_year": "1998", "mfg_make": "FMerc", "mfg_model": "Model C", "images": [{"url":"www.a.com"}, {"url":"www.b.com"}, {"url":"www.c.com"}]})
//now the query
db.vehicles.find({"vehicle_id":1}, {images:{$slice: 1}})
输出:
{
"vehicle_id" : 1,
"mfg_year" : "1928",
"mfg_make" : "Ford",
"mfg_model" : "Model A",
"images" : [
{
"url" : "www.a.com"
}
]
}
修改强>
您可以像这样指定 要返回的字段:
db.vehicles.find({"vehicle_id":1}, {"mfg_make":1, images:{$slice: 1}})
因此,在这种情况下,只返回mfg_make
和images
。
...另
db.vehicles.find({"vehicle_id":1}, {"mfg_make":1, "some_other_field":1, images:{$slice: 1}})
如果这是一个RDBMS,则此查询等同于:
SELECT mfg_make, some_other_field FROM tblVehicles WHERE vehicle_id = 1
答案 1 :(得分:0)
使用聚合框架,您可以使用运算符$project
和$first
(在MongoDB 4.4版及更高版本中可用)来获得所需的结果:
db.collection.aggregate([
{ '$project': {
'vehicle_id': 1,
'vehicle': {
'mfg_year': '$vehicle.mfg_year',
'mfg_make': '$vehicle.mfg_make',
'mfg_model': '$vehicle.mfg_model',
'mfg_trim': '$vehicle.mfg_trim',
'images': { '$first': '$vehicle.images' }
}
} }
])
或带有$arrayElemAt
db.collection.aggregate([
{ '$project': {
'vehicle_id': 1,
'vehicle': {
'mfg_year': '$vehicle.mfg_year',
'mfg_make': '$vehicle.mfg_make',
'mfg_model': '$vehicle.mfg_model',
'mfg_trim': '$vehicle.mfg_trim',
'images': { '$arrayElemAt': ['$vehicle.images', 0] }
}
} }
])
或带有$slice
db.collection.aggregate([
{ '$project': {
'vehicle_id': 1,
'vehicle': {
'mfg_year': '$vehicle.mfg_year',
'mfg_make': '$vehicle.mfg_make',
'mfg_model': '$vehicle.mfg_model',
'mfg_trim': '$vehicle.mfg_trim',
'images': { '$slice': ['$vehicle.images', 1] }
}
} }
])