2

次のクエリが機能しないようです。

Group.find({ $or: [ {'groupOwner': req.user._id }, { 'subscribers.user': req.user._id, 'subscribers.level': 'owner' } ] }, 'groupName', { sort: ['groupName', 'ascending'] }, function(err, groups) {

私のスキーマには、サブドキュメント配列としてサブスクライバーを持つグループがあります。groupOwner が渡されたユーザー ID と一致する (正常に動作する) すべてのグループと、subscribers.user = req.user._id AND subscribers.level = 'owner' であるすべてのドキュメントを検索したい

記述されたクエリは、subscribers.user = req.user._id または level = 'owner' のサブスクライバーが存在するすべてのサブドキュメントを返します。明確にするために、サブドキュメントにsubscribers.user = req.user._idがあり、同じサブドキュメントにsubscribers.level = 'owner'があるグループのみが必要です。

$and と $elemMatch のすべての方法を試しましたが、取得できません。助けてくれてありがとう!

4

1 に答える 1

7

$elemMatch同じ配列要素内の複数のフィールドに一致する場合、正しい演算子です。クエリは次のようになります。

Group.find(
  { $or: [ 
    { groupOwner: req.user._id }, 
    { subscribers: { $elemMatch: { user: req.user._id, level: 'owner' }}}
  ]}, 
  'groupName', 
  { sort: ['groupName', 'ascending'] }, 
  function(err, groups) { ...
于 2013-03-15T21:35:48.123 に答える