2017-02-22 4 views
1

私のコレクションには、以下のスキーマに従って特定のエントリを取得したいと考えています。MongoDBは別のフィールドを持つアイテムを見つける

それは、最新のを取得するためにversionによってソートされ、objectIdによってのみ、最新取得するために、次いで、濾過同じobjectClassことmusst(注:それはアイテムIDではありません!!!)

は、私はすでにいくつかの組み合わせを試してみました個別のグループと、それに

コレクション(歴史)を取得いけない:

{ "_id" : ObjectId("AAA"), "objectId" : ObjectId("BBB"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("1"), "fields" : {...} } 
{ "_id" : ObjectId("AAB"), "objectId" : ObjectId("BBB"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("2"), "fields" : {...} } 
{ "_id" : ObjectId("AAC"), "objectId" : ObjectId("BBB"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("3"), "fields" : {...} } 
{ "_id" : ObjectId("AAD"), "objectId" : ObjectId("BBA"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("1"), "fields" : {...} } 
{ "_id" : ObjectId("AAE"), "objectId" : ObjectId("BBA"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("2"), "fields" : {...} } 
{ "_id" : ObjectId("AAF"), "objectId" : ObjectId("BBA"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("3"), "fields" : {...} } 

私の現在の文は(期待できない結果を返します):

db.history.find({objectClass: "AAA\BBB\CCC"}).sort({version: -1}); 

期待される結果:

[ 
    { "_id" : ObjectId("AAC"), "objectId" : ObjectId("BBB"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("3"), "fields" : {...} } 
    { "_id" : ObjectId("AAF"), "objectId" : ObjectId("BBA"), "objectClass" : "AAA\BBB\CCC", "version" : NumberInt("3"), "fields" : {...} } 
] 

答えて

1

を私はあなたがいくつかの呼び出しで骨材とパイプを使用したいと思います。以下は私がテストしなかったクエリですが、あなたに良いアイデアを与えるべきです。ドキュメントを最初にソートし、次にobjectClassでグループ化し、他のフィールドの最初の値だけを取得し、最後にデータを元の形式に戻します。

db.history.aggregate([ 
    { 
     "$match":{ "objectClass": "AAA\BBB\CCC" } 
    },{ 
     "$sort": {"version":-1} 
    },{ 
     "$group":{ 
      "_id":"$objectId", 
      "objectClass": {"$first": "$objectClass"}, 
      "version": {"$first": "$version"}, 
      "origId": {"$first": "$_id"}, 
      "fields": {"$first": "$fields"} 
     } 
    },{ 
     "$project":{ 
      "_id":"$origId", 
      "objectId": "$_id", 
      "objectClass":1, 
      "version": 1, 
      "fields": 1 
     } 
    } 
]) 
+0

あなたは '}'と '$ mach'を見逃しましたが、すごくうまくいきます!ありがとうございました! +1 –

+1

@JasonSchilling私が逃したものを指摘してくれてありがとう。私は戻って質問を修正した – Woodsy

関連する問題