次のデータを含むコレクションがあります:
db.MyCollection.insert({
id: 1,
Location: [ 1, 1 ],
Properties: [ { Type: 1, Value: "a" }, { Type: 2, Value: "b" }, { Type: 3, Value: "c" } ]
});
db.MyCollection.insert({
id: 2,
Location: [ 1, 2 ],
Properties: [ { Type: 1, Value: "a" }, { Type: 2, Value: "a" }, { Type: 3, Value: "c" } ]
});
db.MyCollection.insert({
id: 3,
Location: [ 2, 1 ],
Properties: [ { Type: 1, Value: "a" }, { Type: 3, Value: "b" }, { Type: 3, Value: "a" } ]
});
db.MyCollection.insert({
id: 4,
Location: [ 2, 2 ],
Properties: [ { Type: 2, Value: "b" }, { Type: 2, Value: "a" }, { Type: 3, Value: "c" } ]
});
db.MyCollection.ensureIndex({ Location: "2d"});
db.MyCollection.ensureIndex({ "Properties.Type": 1, "Properties.Value": 1});
db.MyCollection.ensureIndex({ Location: "2d", "Properties.Type": 1, "Properties.Value": 1});
私が望むのは、(上記のインデックスのいずれかを使用して)次のすべてのアイテムを見つけることです。
- 場所を一致させる
- (Type=1 and Value="a") および (Type=2 and Value="b") のプロパティを含む
これが私のクエリです(機能しませんが、正しいクエリに近いように見えます):
db.MyCollection.find(
{
Location: { "$within": { "$center": [ [1, 1], 5 ] } },
Properties: {
$elemMatch: {
$and: [
{ Type: 1, Value: "a" },
{ Type: 2, Value: "b" }
]
}
}
})
アップデート:
$and one に問題があるため、$all クエリはより適切に機能します (JohnnyHK の回答の私のコメントを参照してください)。手伝ってくれてありがとう。