2016-10-08 9 views
0

内部配列の特定の項目を含まない一連の文書を返すにはどうすればよいですか?特定の内部配列項目を含まないMongoDB文書を返します

マイデータスキームは次のとおりです。

投稿:

{ 
    "_id" : ObjectId("57f91ec96241783dac1e16fe"), 
    "votedBy" : [ 
     { 
      "userId" : "101", 
      "vote": 1 
     }, 
     { 
      "userId" : "202", 
      "vote": 2 
     } 
    ], 
    "__v" : NumberInt(0) 
} 

私はvotedByアレイのいずれかに指定したユーザIDが含まれている非そのうちポストのセットを返すようにしたいです。 公式文書は、これが可能であることを意味する:

MongoDB documentation: Field with no specific array index

それは(特定のアレイ項目に文書を見つけるのより簡単な場合)空のセットを返したが。 votedBy.0.userIdのように、正しい結果セットのインデックスを知っている必要があるようです。

This質問は(私のスキームに適用)この溶液を用いて、私が見つけた最も近い:

db.collection.find({"votedBy": { $not: {$elemMatch: {userId: 101 } } } }) 

配列内の唯一の内部文書は、私が戻らない希望するものと一致する場合には、正常に動作しますが、上で指定した例の場合、userId = 202内部文書が見つかるため、文書が返されます。

明確にする:すべてのドキュメントを返却し、投票済みの配列アイテムのうちNONEに与えられたuserIdがないことを確認します。

さらに簡単な配列を試しましたが、userIdだけが文字列の配列として格納されていましたが、それぞれがIdを受け取り、検索プロセスはまったく同じです。

私が試みたもう1つの解決策は、ユーザーボートのために別のコレクションを使用し、SQL類似の結合を実行するためにルックアップを適用することですが、より簡単な方法があるようです。

私はmongoose(node.js)を使用しています。

答えて

1

ユーザー埋め込まuserId$ne

db.collection.find({'votedBy.userId': {$ne: '101'}}) 

それは、userId = "101"

+0

こんにちは@Tomのうちの少なくとも1種の元素でお返事に感謝をすべての文書をフィルタリングします。私はこれがうまくいきません(すべての文書を返します)。より簡単な例を見てみましょう: {'votedBy.userId': '101'} Shoudは要素101を持つ文書だけを返しますが、結果はまったく返しません。 理由は、私の意見では、(すべてのインデックスで繰り返しているはずですが) 'votedBy.0.userId'としか動作しませんが、この結合ドット法では何も見つかりません。 –

+1

@ Bobcat100それは働いています、私はバージョン3.2でそれをテストしました(古いバージョンに関してはわかりません)ので、スキーマが質問とまったく同じで、正しくコピーしたことを確認してください。あなたが与える例と '$ ne'を用いたクエリは同じではありません。 '{'votedBy.userId': '101'}'は少なくとも1つの要素が '' 101 ''のすべての文書を返します。私の答えのクエリは '' 101 ''の要素がない文書を返します。 '。 – TomG

+0

単純なクエリでは、votedBy.userIdは機能しません。私は別のバージョンを持っているとは思わない、最新のAzure documentDBを使っているので、このバージョンをサポートするはずだ。 私の例が{'votedBy。userId ':' 101 '}は101または[]の回答を含む文書を返しますか?ありがとう、Barak。 –

関連する問題