2017-12-03 13 views
0

데이터베이스에서 새로 판매 된 네 가지 항목을 검색하는 방법에 대해 고민 중입니다. Order라는 스키마가 있는데이 필드에는 item이라는 필드가 있습니다.이 스키마는이 주문으로 판매되는 항목입니다. 현재 주문 문서를 최신순에서 가장 오래된 것으로 정렬하고 4 가지 주문에 대해 한도를 정하고이 4 가지 최신 주문과 관련된 항목을 검색합니다. 1 주문에는 단 1 품목 만 있습니다.몽구스가 가장 최근에 네 개의 별개 품목을 팔았습니다

그러나 항목이 고유하지 않아도됩니다. 어쩌면이 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

은 그래서 당신은 사용할 수 있습니다 이것이 가능하지

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") 
} 

컬렉션 : 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" 
} 

그래서 당신은 당신이 할 수있는 기술 내용에 따라 :

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 } 
]) 

내가 말했듯이을 사용하는 것이 현명 할 것이다. 모든 것을하기 전에. 예를 들면 다음과 같습니다.

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

오, 외래 키가있는 두 개의 콜렉션이 있습니까? 이 경우 ['$ lookup'] (https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)을 사용할 수 있습니다. 설명에 설명해 주시겠습니까? –

+0

예, 확실하게 질문을 업데이트했습니다. –