我需要根据所有相同的关键字进行查询,让我们说以下是订单,该订单包含三个产品。我需要查询具有特定状态等于true的产品的订单。每个产品都以mongo id作为密钥进行存储,因此我实际上并不知道它的关键名称,例如:(显然我已经缩短了密钥)
{
"_id" : "foo",
"products": {
"123": {
"status": {
"a": false,
"b": true,
"c": true,
},
},
"213": {
"status": {
"a": true,
"b": true,
"c": true,
},
},
"321": {
"status": {
"a": false,
"b": false,
"c": true,
},
}
},
}
以下是我尝试的内容:
$this->database->$collection->find(
array('_id' => 'foo', 'products.$.status.c' => true)
);
我希望上述内容能够返回示例中的完整订单,作为状态' c'如果我要执行相同的查询,但是使用' a'或者' b'作为状态查询,它不会返回它。
我不确定如何做到这一点,显然上面没有用,所以我的问题是,如何匹配我不知道的对象数组的多个子键关键名称?
答案 0 :(得分:0)
您需要一个文档数组,而不是一个以id作为键的对象。 $位置运算符不会处理对象。
{
"_id" : "foo",
"products": [
{
id: "123"
"status": {
"a": false,
"b": true,
"c": true,
},
},
{
id: "213"
"status": {
"a": true,
"b": true,
"c": true,
},
},
{
id: "321"
"status": {
"a": false,
"b": false,
"c": true,
},
}
]
}
您的查询需要如下所示:
$this->database->$collection->find(
array('_id' => 'foo', 'products.status.c' => true)
);
这会将光标返回到第一个'产品'与您的查询匹配 并在udpate上。
$this->database->$collection->find(
array('_id' => 'foo', 'products.status.c' => true),
array('products.$.hello' => 'world')
);
仅更新该子文档。您应该使用对象的唯一时间是您知道密钥是什么。就像状态或地址一样......但如果密钥也是一个变量,那么它变得非常棘手,非常快。