2017-05-23 11 views
1

1つの別個のフィールドを持ったままドキュメント全体を返すクエリを書くのに問題があります。 私はすでに集約を混乱させようとしましたが、役に立たなかった。別のフィールドと1つの選択クエリでMongoDBのドキュメント全体を返す

How to efficiently perform "distinct" with multiple keys?

は、それは私が必要なソリューションのほとんどを説明したが、私は同様に別のフィールドにフィルタを適用する必要があります:私はすでにいくつかの時間をグーグル後、この文書を発見しました。

これは私がTempCollection内のドキュメントのソートされたリストを照会するために今使用する関数です。

function getLatestUserData(UserID, callback) { 
    console.log("in func  " + UserID); 
    Temp.find({ UId: UserID }).sort({ "created_at" : -1 }).exec(function (err, data) { 
    console.log(data + "  " + err); 
    callback(data); 
    }); 
}; 

しかし、どのようにフィルタリング、並べ替え、別個のすべてを同時に行うことができないのか分かりません。

しかしこれは、かなりの時間のための記事を読んで、私はちょうど私が必要とするために、構文を把握することはできません、集約を使用しての試みである:ここでは

function getLatestUserData(UserID, callback) { 
    Temp.aggregate([ 

    {"$group": { "_id": { value: "$value", SerialNumber: "$SerialNumber" } }}, 
    {$filter : {input: "$UId", as: "UId", cond: {$U: [ "$UId", UserID ]} }} 
    ]).exec(function (err, data) { 
    callback(data); 
    }); 
}; 

はTempCollectionの一部です。 :

/* 1 */ 
{ 
    "updatedAt" : ISODate("2017-05-23T13:01:45.000Z"), 
    "created_at" : ISODate("2017-05-23T13:01:45.000Z"), 
    "UId" : "590b10221da091b2618a4913", 
    "value" : 36, 
    "SerialNumber" : "TEST2", 
    "_id" : ObjectId("592432b9372464833d038b80"), 
    "__v" : 0 
} 

/* 2 */ 
{ 
    "updatedAt" : ISODate("2017-05-23T14:23:39.000Z"), 
    "created_at" : ISODate("2017-05-23T14:23:39.000Z"), 
    "UId" : "58f8954c3602b80552b6f1fb", 
    "value" : 39, 
    "SerialNumber" : "IIOJOIMJ", 
    "_id" : ObjectId("592445eb372464833d038bf4"), 
    "__v" : 0 
} 

ご協力いただきありがとうございます。最新の文書全体を選択する$first蓄積オペレータの内側$$ROOT変数を使用している間

+1

[Mongooseの異なる値をクエリするにはどのようにしてドキュメントをすべて返すのですか?](https://stackoverflow.com/questions/43895084/how-do-i-query-for-distinct-values -in-mongoose-but-return-all-the-doc) – Veeram

+1

リンクされたdupsから '$ match'と' $ sort'ステージの後に '$ group'を' $$ ROOT'で追加する必要があります。 – Veeram

+2

@Veeramそれから彼らに答えを与えてください。質問には '$ filter'と表示されているので、[パイプライン集計ステージ](https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/)との違いを一般的な演算子に示すと便利です –

答えて

1

あなたはUID代わりの$filter$matchを追加する必要がありますcreated_atと個別のキーを上$group上DESC $sort続く(のみ配列フィールド で使用) 。

何か

Temp.aggregate([ 
    {"$match":{ "UId": UserID }}, 
    {"$sort":{ "created_at" : -1 }}, 
    {"$group": { "_id": { value: "$value", SerialNumber: "$SerialNumber" }, "data":{"$first":"$$ROOT"}}} 
    ]) 

よう dataフィールドには、最新のドキュメントを持つことになります。

+0

素晴らしく見える!しかし、私がこの 'data = Temp.aggregate( {" $ match ":{" UId ":UserID}}を実行すると、 {" $ sort ":{" created_at ":-1}}、 { $ group "、" data ":{" $ push ":" $$ ROOT "}}} ])。 – Krapton

+1

コードを使用した後に回答を更新しました。コードを使用した後、私は答えを更新しました。 '$ push'の代わりに' $ first'を使用してください。それ以外はデータを取得します。 – Veeram

関連する問題