2

だから、私がやろうとしているのは、「パリ」の都市と「フランス」の州を持つすべての文書を照会することです。何らかの結合を行う必要がありますが、それを構築する方法を理解できませんでした。

私は c# ドライバーを使用していますが、どのような方法でも喜んでサポートいたします。

{
    "_id" : ObjectId("519b407f3c22a73a7c29269f"),
    "DocumentID" : "1",
    "Meta" : [{
        "Name" : "City",
        "Value" : "Paris",
    }, {
        "Name" : "State",
        "Value" : "France",
    }
    }]
}

{
    "_id" : ObjectId("519b407f3c22a73a7c29269g"),
    "DocumentID" : "2",
    "Meta" : [{
        "Name" : "City",
        "Value" : "Paris",
    }, {
        "Name" : "State",
        "Value" : "Texas",
    }
    }]
}
4

2 に答える 2

5

$elemMatch演算子は、その中のすべての条件が同じ配列要素と一致する必要があることを示すために使用されます。したがって、(シェル構文に切り替えるには) メタ都市 Paris を持つすべてのドキュメントに一致させるには、次のようにします。

db.collection.find( {Meta:{$elemMatch:{Name:"City",Value:"Paris"}}} )

これにより、配列内のどこかに Name: "somethingelse"、Value: "Paris" があり、Name:"City" に一致する別の配列要素と一致しないことが保証されます。

現在、クエリ条件を組み合わせるデフォルトの組み合わせは「and」であるため、引き続き属性を追加できます。

db.collection.find( {Meta: {
                       $elemMatch:{Name:"City",Value:"Paris"}, 
                       $elemMatch:{Name:"State",Value:"France"} 
      }
  } 
)

別の条件を追加したい場合は追加し続けますが、NOT が必要な場合は次のようにします。

db.collection.find( {Meta: {
                       $elemMatch:{Name:"City",Value:"Paris"}, 
                       $elemMatch:{Name:"State",Value:"France"},
                       $not: {$elemMatch:{Name:"Arrondissement",Value:"Louvre"}}
      }
  } 
)
于 2013-05-21T14:22:28.013 に答える
0

ここで自分の質問に答えているかもしれませんが、MongoDB は初めてなので、これで求めている結果が得られるように見えますが、最適なアプローチではない可能性があります。

var result = collection.Find(
   Query.And(
   Query.ElemMatch("Meta", Query.EQ("Name", "City")),
   Query.ElemMatch("Meta", Query.EQ("Value", "Paris")),
   Query.ElemMatch("Meta", Query.EQ("Name", "State")),
   Query.ElemMatch("Meta", Query.EQ("Value", "France")))
   );

「都市」が「パリ」で「州」が「フランス」であるが、「区」が「ルーヴル美術館」ではないすべての文書を取得するにはどうすればよいですか?

于 2013-05-21T13:15:47.217 に答える