0

私は自分自身をググることができないように見える、かなりユニークなクエリを実行しようとしています。これは私の最初の本物の Meteor アプリでもあります。私は最終的に、ユーザーがまだ「好き」または「嫌い」になっていないすべてのリストを返そうとしています。

基本的に、foo のリストを持つすべてのユーザーは、すべてのバーのリストを表示し、好きか嫌いかを選択して、相互に一致するかどうかを最終的に確認できます。リストが気に入った場合、気に入ったリストの _id を自分のリストの likes 配列にプッシュします (dislikes と同じ)。私の元で。以下では、リスティング ID「a」はリスティング「b」と「d」の両方を気に入っていますが、c はまだ見ていません。

一致する部分は機能していますが、既に見たリストを表示し続けたくありません。

現在、コレクションとクエリは次のようになっています (例として要約)。現在、これは非常に非効率的で面倒に見えます:

userLikes = listings.findOne({ userId: Meteor.userId() }).likes
userDisikes = listings.findOne({ userId: Meteor.userId() }).dislikes

listings.find({ type: 'bar', 
  likes: {$nin: userLikes }, dislikes: {$nin: userDislikes} })

listings collection:
{
  _id: 'a',
  userId: 'someuserid',
  type: 'foo',
  likes: ['b','d'],
  dislikes: []
},
{
  _id: 'b',
  userId: 'someuserid',
  type: 'bar',
  likes: ['a'],
  dislikes: []
},
{
  _id: 'c',
  userId: 'someuserid',
  type: 'bar',
  likes: [],
  dislikes: []
},
{
  _id: 'd',
  userId: 'someuserid',
  type: 'bar',
  likes: [],
  dislikes: []
}

振り返ってみると(これを入力している間)、元のアプローチが逆だったと思います。いいねされたリスティングにライクのリスティング ID を保存するだけでよいですか? _idたとえば、ユーザーをお気に入りリストの配列などにプッシュして、wasLikedBy代わりに次のようにクエリできるようにします。 listings.find({type:'bar', {wasLikedBy: {$ne: 'a'}} })

これに取り組む方法についてのアドバイスは大歓迎です。私はデータベースも初めてなので、できるだけすべてを吸収しようとしています。

4

1 に答える 1

1

多対多の関係を設計する場合、3 つの基本的な可能性があります。一方に配列を格納するか、もう一方に配列を格納するか、結合テーブルを作成します。それぞれの選択肢には長所と短所があり、どちらを使用するかは、モデルにとって何が簡単か、またはより適切かによって決まります。選択に関係なく、すべてのことを簡単に実行できるはずです。

この場合、Mongo による配列の扱いに慣れる必要があります。基本的に、配列のすべての要素に条件が適用されるため$ne、配列パラメーターで使用すると、配列に指定された要素が含まれていない結果が得られます。

簡単に言えば、コードは次のとおりです。

listings.find({
    type: 'bar', 
    likes: {$ne: Meteor.userId()},
    dislikes: {$ne: Meteor.userId()},
});
于 2013-10-14T12:26:54.823 に答える