2016-12-19 7 views
0

私は3つのマングースモデルを持っていますマングース集合とマッチとフィルタリングを組み合わせたもの

ユーザーが好きなときに、Likedコレクションに保存されます。しかし、私がしたいのは、です。ユーザーが以前に気に入っていなかった10の製品を提供するクエリを作成し、自分の製品ではありません。私はこれを1つのクエリで可能にする方法を理解できません。それは可能でしょうか?

ユーザー:

{ 
    password: String, 
    type: { 
     type: String, 
     enum: ['user', 'admin'], 
     required: true, 
     default: "user" 
    }, 
    firstName: {type: String}, 
    middleName: {type: String}, 
    lastName: {type: String}, 
    gender: {type: String}, 
    profilePicture: {type: Object}, 
    setOwnProfilePicture: {type: Boolean, default: false}, 
    facebook:{ 
     id: {type: String}, 
     token: {type: String} 
    } 
} 

製品:

{ 
    condition: { 
     type: String, 
     enum: ['Als nieuw', 'Goed', 'Redelijk', 'Matig'], 
     required: true, 
     default: "Goed" 
    }, 
    type: { 
     type: String, 
     enum: ['Ruilen', 'Doneren'], 
     required: true, 
     default: "Ruilen" 
    }, 
    zipCode: {type: String}, 
    houseNumber: {type: String}, 
    distance: {type: Number}, 
    likes: {type: Number, default: 0}, 
    dislikes: {type: Number, default: 0}, 
    title: {type: String}, 
    description: {type: String}, 
    owner: {type: Schema.ObjectId}, 
    images: { type : Array , "default" : [] } 
} 

が気に入ら:

{ 
    ownerProductID: {type: Schema.ObjectId}, 
    productID: {type: Schema.ObjectId}, 
    liked: Boolean 
} 

UPDATE: は、私が使用するクエリが、結果には、私は、フィールドを持っているかを調べますlikedと呼ばれますが、これをフィルタリングしたいので、私の中に余分な値はありません結果。

私が今使用して、クエリ:複数のレベルでフィルタリングする

db.products.aggregate(

    // Pipeline 
    [ 
     // Stage 1 
     { 
      $match: {'owner': {$ne: ObjectId("583f2f33ee975f4e8560b9fe")}} 
     }, 

     // Stage 2 
     { 
      $lookup: { 
       "from" : "likes", 
       "localField" : "_id", 
       "foreignField" : "productID", 
       "as" : "liked" 
      } 
     }, 

     // Stage 3 
     { 
      $match: {'liked.ownerProduct': {$nin: [ObjectId("585834609bb1aa1cbe98257b")]}} 
     }, 

     // Stage 4 
     { 
      $limit: 10 
     }, 

    ] 

); 

答えて

1

使用集計。

あなたはUSER_OBJECTIDがあると仮定して、最初に所有者の製品をフィルタリングし、Likedでコレクションに参加し、ユーザーIDで再度フィルタリングします。

db.Product.aggregate([ 
    {$match: {'owner': {$ne: '<USER_OBJECTID>'}}}, 
    {$lookup: { 
     from: 'liked', 
     localField: '_id', 
     foreignField: 'productID', 
     as: 'likes' 
     } 
    }, 
    {$match: {'likes.userID': {$nin: [<USER_OBJECTID>]}}}, 
    {$limit: 10} 
]) 
+0

私のモデルを少し変更しました。 likesコレクションには製品IDが含まれています。これは、製品モデル内でユーザーを参照するためです。私は何を変更する必要がありますか? – toonvanstrijp

+0

@toonvanstrijpどのユーザーがどの製品を好きだったかをどのように保存しますか?好きな 'ownerProductId'は何ですか? – sidgate

+0

実際には他の製品が好きです。だから私は、どの製品がお互いに好きかどうかを把握する必要があります。これはユーザーが商品を交換できるような種類のシステムです。しかし、私はmongoDBクエリに苦労しています。 Likedコレクションでは、どの製品が何を好きだったかを把握しています。私は彼が好きなことができる製品のリストをユーザーに提供する必要があります。だから私は、特定の製品から何が好きなのかをフィルタリングする必要があります。これが私の店をより明確にすることを望みますか? – toonvanstrijp

1

私は望む結果を得ることができました。このクエリを使用して:

db.products.aggregate(

    [ 
     { 
      $match: {'owner': {$ne: ObjectId("583f2f33ee975f4e8560b9fe")}} 
     }, 
     { 
      $lookup: { 
       "from" : "likes", 
       "localField" : "_id", 
       "foreignField" : "productID", 
       "as" : "liked" 
      } 
     }, 
     { 
      $match: {'liked.ownerProduct': {$nin: [ObjectId("585834609bb1aa1cbe98257b")]}} 
     }, 
     { 
      $limit: 10 
     }, 
     { 
      $project: { 
       _id: 1, 
       owner: 1, 
       zipCode: 1, 
       title: 1, 
       description: 1, 
       houseNumber: 1, 
       images: 1, 
       dislikes: 1, 
       likes: 1, 
       type: 1, 
       condition: 1 
      } 
     }, 
    ] 
); 
関連する問題