4

鉴于集合中的以下布局...

{
  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 上做一个组,我只是希望有一个更简单的查询结构,而不需要求助于组或 reduce。

如果目前通过聚合框架无法做到这一点,那么工作组或 map-reduce 将是一个可以接受的答案。


编辑:在最终结果中我不想要大约 50 多个属性。使用 $slice 指令,我似乎不能只指定我想要的字段。

4

2 回答 2

7

怎么样:

db.vehicles.find({"vehicle_id":1}, {images:{$slice: 1}})

来源: http ://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

例子

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_makeand 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
于 2012-11-19T17:51:04.890 回答
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] }
        }
    } }   
])
于 2020-11-04T15:42:12.993 回答