0

次のようなコレクションがあるとします。

> db.test.find({}, {_id:0})
{ "name" : "star wars I", "duration" : 120 }
{ "name" : "star wars II", "duration" : 125 }
{ "name" : "star wars III", "duration" : 135 }
{ "name" : "star wars IV", "duration" : 115 }
{ "name" : "star trek I", "duration" : 135 }
{ "name" : "star trek II", "duration" : 200 }
{ "name" : "alien", "duration" : 200 }

この SQL ステートメントと同等のクエリを作成するにはどうすればよいですか?

SELECT * FROM test
WHERE (name LIKE '%star%' AND NOT name LIKE '%wars%') OR duration = 200

より単純なクエリでも、期待される結果を得ることができません。次に例を示します。

これは期待どおりに機能します。

> db.test.find({ name: /star/i, name: /trek/i }, {_id:0})  
{ "name" : "star trek I", "duration" : 135 }  
{ "name" : "star trek II", "duration" : 200 }

しかし、これは結果を返しません。なんで?

> db.test.find({ name: /star/i, $not: {name: /trek/i} }, {_id:0})
4

3 に答える 3

1

$notは他の演算子を否定するためのものであるため、この時点で$ne演算子を使用する必要があります。

編集:ピーターがコメントで述べたように、 $ne はここでは機能しません (正規表現は演算子であるため)。クエリの順序が間違っていました。

> db.test.find({ name: /star/i, name: { $not: /trek/i } }, {_id:0})

指定された SQL のクエリは次のようになります。

> db.test.find({$or:
    [
      { name: /star/i, name: { $not: /trek/i } },
      { duration: 200 }
    ]
  },{_id:0})
于 2013-03-27T18:16:41.200 に答える
1

これを試して:
db.test.find({name: {$regex: /star/i , $not: /trek/i }}, {_id:0});

于 2013-03-27T18:29:47.913 に答える
0

「スター」という単語は「スター ウォーズ」と「スタートレック」の両方のレコードに共通しているため、クエリを変更することをお勧めします。

これは提案です

db.test.find({name:{$regex:/wars/,$nin:["trek"] }},{_id:0})
{ "name" : "star wars I", "duration" : 120 }
{ "name" : "star wars II", "duration" : 125 }
{ "name" : "star wars III", "duration" : 135 } 
{ "name" : "star wars IV", "duration" : 115 }
于 2013-03-27T20:03:52.567 に答える