2017-12-03 9 views
0

データベースから4つの新しく売った商品を取り出す方法について頭を悩ませています。 Orderと呼ばれるスキーマがあり、itemというフィールドがあります。これはこの注文で販売されたアイテムだけです。現在、私は注文書を最新のものから古いものに並べ替え、4つの注文の制限を行い、これら4つの最新注文に関連する商品を検索します。 1つの注文には1つのアイテムしかありません。マングースは最新の4つの異なる商品を販売しました

ただし、項目は一意である必要はありません。おそらく、これらの4つの最新の注文はすべて1つのアイテムです。最初のページに4つの正確な項目があることは、これらの4つが新たに販売されていると言っているのはばかげているでしょう。私はdistinct()、aggregate、groupなどの使用を検討しましたが、どれも自分の目標に合っていないようです。私は4つのユニークなアイテムを得るまで、1で1を検索するために無差別な力を使わないようにしたい。

誰でも私にこれを達成するためのヒントを教えてもらえますか?

Order{ 
    item: {type: ObjectId, ref: "Item"}, 
    date_added: {type: Date, default: Date.now} 
} 

Item{ 
    name: {type: String}, 
    price: {type: Number} 
} 

答えて

1

だから、このすべてが1つのコレクションにあった場合に使用できます。これができないあなたの質問を更新した後

db.Order.aggregate([ 
    {$sort: {_id: -1}}, 
    {$group: { 
    _id: "$item", 
    firstId: {$first: "$_id"}  
    } 
    }, 
    {$sort: {firstId: -1}}, 
    { $limit: 4 } 
]) 

。コレクションorder

{ 
    "_id" : ObjectId("5a25361a38f4fb1fc057bb95"), 
    "item" : ObjectId("5a2535d238f4fb1fc057bb92"), 
    "date_added" : ISODate("2017-12-04T11:48:42.610+0000") 
} 
{ 
    "_id" : ObjectId("5a25369a38f4fb1fc057bb9b"), 
    "item" : ObjectId("5a25367c38f4fb1fc057bb98"), 
    "date_added" : ISODate("2017-12-04T11:50:50.569+0000") 
} 
{ 
    "_id" : ObjectId("5a254de038f4fb1fc057bba9"), 
    "item" : ObjectId("5a254d7438f4fb1fc057bb9e"), 
    "date_added" : ISODate("2017-12-04T13:30:08.148+0000") 
} 
{ 
    "_id" : ObjectId("5a254e1f38f4fb1fc057bbb2"), 
    "item" : ObjectId("5a254d8938f4fb1fc057bba1"), 
    "date_added" : ISODate("2017-12-04T13:31:38.038+0000") 
} 
{ 
    "_id" : ObjectId("5a254e6438f4fb1fc057bbb5"), 
    "item" : ObjectId("5a254d9e38f4fb1fc057bba4"), 
    "date_added" : ISODate("2017-12-04T13:32:20.244+0000") 
} 

db.order.aggregate([ 

{$sort: {_id: -1}}, 
{ 
    $lookup: 
    { 
     from: "item", 
     localField: "item", 
     foreignField: "_id", 
     as: "items" 
    } 
}, 
{ $unwind: "$items"}, 
{ 
    $group: 
    { 
    _id: "$items.name", 
    orderId: {$first: "$_id"}, 
    itemId: {$first: "$item"}, 
    date_added: {$first: "$date_added"}, 
    itemName: {$first: "$items.name"}, 
    itemPrice: {$first: "$items.price"}, 
    } 
}, 
{$sort: {orderId: -1}}, 
{ $limit: 4 } 
]) 
item

{ 
    "_id" : ObjectId("5a2535d238f4fb1fc057bb92"), 
    "name" : "mouse", 
    "price" : "50" 
} 
{ 
    "_id" : ObjectId("5a25367c38f4fb1fc057bb98"), 
    "name" : "keyboard", 
    "price" : "100" 
} 
{ 
    "_id" : ObjectId("5a254d7438f4fb1fc057bb9e"), 
    "name" : "monitor", 
    "price" : "500" 
} 
{ 
    "_id" : ObjectId("5a254d8938f4fb1fc057bba1"), 
    "name" : "mouse", 
    "price" : "15" 
} 
{ 
    "_id" : ObjectId("5a254d9e38f4fb1fc057bba4"), 
    "name" : "headphones", 
    "price" : "110" 
} 

ですから、あなたがこれを行うことができます説明したものに基づいて

コレクション:だから、私は次のように作成した例を複製します

私が言ったように、$matchを実行してください。このように例:

db.order.aggregate([ 
{ $match: {"date_added" : {$gte: ISODate("2017-12-04T11:48:43.610+0000")}}}, 
{$sort: {_id: -1}}, 
{ 
    $lookup: 
    { 
     from: "item", 
     localField: "item", 
     foreignField: "_id", 
     as: "items" 
    } 
}, 
{ $unwind: "$items"}, 
{ 
    $group: 
    { 
    _id: "$items.name", 
    orderId: {$first: "$_id"}, 
    itemId: {$first: "$item"}, 
    date_added: {$first: "$date_added"}, 
    itemName: {$first: "$items.name"}, 
    itemPrice: {$first: "$items.price"}, 
    } 
}, 
{$sort: {orderId: -1}}, 
{ $limit: 4 } 
]) 
+0

アドバイスをいただきありがとうございます!ちなみに、私のアイテムフィールドは実際にはItemというスキーマに移入できる_idです。私がこの作業をしている間、私は人がいないので、この操作の後にこれらの4つの_idsを手動で検索しなければならないのでしょうか? –

+0

ああ、あなたは2つのコレクションを持っています。この場合、['$ lookup'](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)を使うことができます。あなたの説明でそれを説明できますか? –

+0

はい、確かに質問を更新しました。 –

関連する問題