ハッシュを使用して保存された埋め込みドキュメントのプロパティのクエリを MongoDB がサポートしないのはなぜですか?
たとえば、次のように作成された「invoices」というコレクションがあるとします。
db.invoices.insert(
[
{
productsBySku: {
12432: {
price: 49.99,
qty_in_stock: 4
},
54352: {
price: 29.99,
qty_in_stock: 5
}
}
},
{
productsBySku: {
42432: {
price: 69.99,
qty_in_stock: 0
},
53352: {
price: 19.99,
qty_in_stock: 5
}
}
}
]
);
このような構造では、$elemMatch、ドット構文、または位置演算子 ($) を使用した MongoDB クエリは、各 productsBySku メンバーのプロパティにアクセスできません。
たとえば、次のことはできません。
db.invoices.find({"productsBySku.qty_in_stock":0});
db.invoices.find({"productsBySku.$.qty_in_stock":0});
db.invoices.find({"productsBySku.qty_in_stock":{$elemMatch:{$eq:0}}});
db.invoices.find({"productsBySku.$.qty_in_stock":{$elemMatch:{$eq:0}}});
したがって、在庫切れの製品を見つけるには、次のような $where クエリを使用する必要があります。
db.invoices.find({
$where: function () {
for (var i in this.productsBySku)
if (!this.productsBySku[i].qty_in_stock)
return this;
}
});
技術的なレベルでは... なぜ彼らは、クエリに対してこの非常に厳しい制限を設けて MongoDB を設計したのでしょうか? 確かに、この一見重大な欠陥には何らかの技術的な理由があるに違いありません。キーを無視して、オブジェクトのリストを配列として処理できないのは、言語としての JavaScript の単なる制限ですか? それとも、これは MongoDB 内のアーキテクチャ上の決定の結果でしたか?
ちょっと興味があるんだけど。