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:'...',...}
      ,...
    ]
  }
}

上記のフィールドのみ、および画像の下の最初の結果のみを含む結果を返すにはどうすればよいですか?結果が1つのフラット化されたオブジェクトにあり、画像のみがネストされたオブジェクトであるかどうかは関係ありません。

アグリゲーションフレームワークを調べましたが、探しているものと一致していないようです。結果セットでマップ/リデュースを実行したり、listing_idでグループを実行したりできることはわかっています。グループに頼ったり、リデュースしたりすることなく、より単純なクエリ構造を実現したいと考えています。

現在、集約フレームワークを介してこれが不可能な場合は、ワーキンググループまたはmap-reduceが許容できる答えになります。


編集:最終結果に必要のないプロパティが約50以上あります。$sliceディレクティブでは、必要なフィールドを指定するだけでは不十分なようです。

4

2 に答える 2

7

どうですか:

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

ソース: http ://www.mongodb.org/display/DOCS/Retrieveing+a+Subset+of+Fields#RetrieveaSubsetofFields-RetrieveaSubrangeofArrayElements

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_makeimages返されます。

別....

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 に答える