我有这样的文件

   [
    {
      "id": "1",
      "name": "My Product 1",
      "variants": [
        {
          "id": 2179,
          "code": "A",
          "attributes": {
            "att_set_1": {
              "en": {
                "name": "Attribute Set 1",
                "data": [
                  {
                    "id": 919,
                    "title": "Height",
                    "label": "height_mm",
                    "v": 1200,
                    "unit": "mm"
                  },
                  {
                    "id": 921,
                    "title": "Weight",
                    "label": "weight",
                    "v": 500,
                    "unit": "kg"
                  },
                  {
                    "id": 923,
                    "title": "Other",
                    "label": "blah",
                    "v": 200,
                    "unit": "mm"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    {
      "id": "2",
      "name": "My Product 2",
      "variants": [
        {
          "id": 2180,
          "code": "B",
          "attributes": {
            "att_set_1": {
              "en": {
                "name": "Attribute Set 1",
                "data": [
                  {
                    "id": 919,
                    "title": "Height",
                    "label": "height_mm",
                    "v": 1300,
                    "unit": "mm"
                  },
                  {
                    "id": 921,
                    "title": "Weight",
                    "label": "weight",
                    "v": 200,
                    "unit": "kg"
                  },
                  {
                    "id": 923,
                    "title": "Other",
                    "label": "blah",
                    "v": 200,
                    "unit": "mm"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    {
      "id": "3",
      "name": "My Product 3",
      "variants": [
        {
          "id": 2181,
          "code": "C",
          "attributes": {
            "att_set_1": {
              "en": {
                "name": "Attribute Set 1",
                "data": [
                  {
                    "id": 919,
                    "title": "Height",
                    "label": "height_mm",
                    "v": 2000,
                    "unit": "mm"
                  },
                  {
                    "id": 921,
                    "title": "Weight",
                    "label": "weight",
                    "v": 999,
                    "unit": "kg"
                  },
                  {
                    "id": 923,
                    "title": "Other",
                    "label": "blah",
                    "v": 200,
                    "unit": "mm"
                  }
                ]
              }
            }
          }
        }
      ]
    }
  ]


现在,我要查找所有其中一种变体的高度> = 1200和重量> = 500的产品。

在此示例中,这应该是“我的产品1”和“我的产品3”。我的产品2不匹配,因为“重量”属性低于标准。

我怎样才能做到这一点。有办法吗数据结构可以更改,但只有在确实需要时才可以更改。

最佳答案

我遵循您的文档,并在cosmos db中创建了3个示例文档,如下所示:

[
  {
    "id": "1",
    "name": "My Product 1",
    "variants": [
      {
        "id": 2179,
        "code": "A",
        "attributes": {
          "att_set_1": {
            "en": {
              "name": "Attribute Set 1",
              "data": [
                {
                  "id": 919,
                  "title": "Height",
                  "label": "height_mm",
                  "v": 2330,
                  "unit": "mm"
                },
                {
                  "id": 921,
                  "title": "Weight",
                  "label": "weight",
                  "v": 2931,
                  "unit": "kg"
                },
                {
                  "id": 923,
                  "title": "Other",
                  "label": "blah",
                  "v": 200,
                  "unit": "mm"
                }
              ]
            }
          }
        }
      }
    ]
  },
  {
    "id": "2",
    "name": "My Product 2",
    "variants": [
      {
        "id": 2180,
        "code": "B",
        "attributes": {
          "att_set_1": {
            "en": {
              "name": "Attribute Set 1",
              "data": [
                {
                  "id": 919,
                  "title": "Height",
                  "label": "height_mm",
                  "v": 100,
                  "unit": "mm"
                },
                {
                  "id": 921,
                  "title": "Weight",
                  "label": "weight",
                  "v": 200,
                  "unit": "kg"
                },
                {
                  "id": 923,
                  "title": "Other",
                  "label": "blah",
                  "v": 200,
                  "unit": "mm"
                }
              ]
            }
          }
        }
      }
    ]
  },
  {
    "id": "3",
    "name": "My Product 3",
    "variants": [
      {
        "id": 2181,
        "code": "C",
        "attributes": {
          "att_set_1": {
            "en": {
              "name": "Attribute Set 1",
              "data": [
                {
                  "id": 919,
                  "title": "Height",
                  "label": "height_mm",
                  "v": 2000,
                  "unit": "mm"
                },
                {
                  "id": 921,
                  "title": "Weight",
                  "label": "weight",
                  "v": 999,
                  "unit": "kg"
                },
                {
                  "id": 923,
                  "title": "Other",
                  "label": "blah",
                  "v": 200,
                  "unit": "mm"
                }
              ]
            }
          }
        }
      }
    ]
  }
]


然后我使用SQL:


  SELECT all FROM all全部加入a.variant加入b
  a.attributes.att_set_1.en.data其中(b.title ='Height'和b.v> =
  2000)或(b.title ='Weight'并且b.v> = 1000)


结果数据:

[
  {
    "all": {
      "id": "1",
      "name": "My Product 1",
      "variants": [
        {
          "id": 2179,
          "code": "A",
          "attributes": {
            "att_set_1": {
              "en": {
                "name": "Attribute Set 1",
                "data": [
                  {
                    "id": 919,
                    "title": "Height",
                    "label": "height_mm",
                    "v": 2330,
                    "unit": "mm"
                  },
                  {
                    "id": 921,
                    "title": "Weight",
                    "label": "weight",
                    "v": 2931,
                    "unit": "kg"
                  },
                  {
                    "id": 923,
                    "title": "Other",
                    "label": "blah",
                    "v": 200,
                    "unit": "mm"
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  {
    "all": {
      "id": "1",
      "name": "My Product 1",
      "variants": [
        {
          "id": 2179,
          "code": "A",
          "attributes": {
            "att_set_1": {
              "en": {
                "name": "Attribute Set 1",
                "data": [
                  {
                    "id": 919,
                    "title": "Height",
                    "label": "height_mm",
                    "v": 2330,
                    "unit": "mm"
                  },
                  {
                    "id": 921,
                    "title": "Weight",
                    "label": "weight",
                    "v": 2931,
                    "unit": "kg"
                  },
                  {
                    "id": 923,
                    "title": "Other",
                    "label": "blah",
                    "v": 200,
                    "unit": "mm"
                  }
                ]
              }
            }
          }
        }
      ]
  },
  {
    "all": {
      "id": "3",
      "name": "My Product 3",
      "variants": [
        {
          "id": 2181,
          "code": "C",
          "attributes": {
            "att_set_1": {
              "en": {
                "name": "Attribute Set 1",
                "data": [
                  {
                    "id": 919,
                    "title": "Height",
                    "label": "height_mm",
                    "v": 2000,
                    "unit": "mm"
                  },
                  {
                    "id": 921,
                    "title": "Weight",
                    "label": "weight",
                    "v": 999,
                    "unit": "kg"
                  },
                  {
                    "id": 923,
                    "title": "Other",
                    "label": "blah",
                    "v": 200,
                    "unit": "mm"
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
]


请注意,value列是关键字,不能在文档中使用。因此,在我的文档中,我用v将其删除。



更新答案:

经过几次尝试之后,似乎不可能通过SQL语句直接从Cosmos DB查询所需的结果。

但是,当我们面对复杂的查询时,Cosmos DB为我们提供了存储过程。如果您不太了解存储过程,可以阅读此article

请参考以下创建的存储过程:

function sample() {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM c',
        function (err, feed, options) {
            if (err) throw err;

            var returnArray = [];

            if (!feed || !feed.length){
                getContext().getResponse().setBody('no docs found');
            } else{
                for(var i=0;i<feed.length;i++){
                    var foundHeight = false, foundWeight=false;
                    var dataArray = feed[i].variants[0].attributes.att_set_1.en.data;
                    for(var j=0;j<dataArray.length;j++){
                      var f = dataArray[j];
                      if((f.title=='Height'&&f.v>=2000){
                        foundHeight = true;
                      } else if(f.title=='Weight'&&f.v>=1000)){
                        foundWeight = true;
                      }
                    }
                    if(foundHeight && foundWeight)
                       returnArray.push(feed[i]);
                }
            }
            getContext().getResponse().setBody(JSON.stringify(returnArray));
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}


输出结果:

[
    {
        "id": "1",
        "name": "My Product 1",
        "variants": [
            {
                "id": 2179,
                "code": "A",
                "attributes": {
                    "att_set_1": {
                        "en": {
                            "name": "Attribute Set 1",
                            "data": [
                                {
                                    "id": 919,
                                    "title": "Height",
                                    "label": "height_mm",
                                    "v": 2330,
                                    "unit": "mm"
                                },
                                {
                                    "id": 921,
                                    "title": "Weight",
                                    "label": "weight",
                                    "v": 2931,
                                    "unit": "kg"
                                },
                                {
                                    "id": 923,
                                    "title": "Other",
                                    "label": "blah",
                                    "v": 200,
                                    "unit": "mm"
                                }
                            ]
                        }
                    }
                }
            }
        ]
    },
    {
        "id": "3",
        "name": "My Product 3",
        "variants": [
            {
                "id": 2181,
                "code": "C",
                "attributes": {
                    "att_set_1": {
                        "en": {
                            "name": "Attribute Set 1",
                            "data": [
                                {
                                    "id": 919,
                                    "title": "Height",
                                    "label": "height_mm",
                                    "v": 2000,
                                    "unit": "mm"
                                },
                                {
                                    "id": 921,
                                    "title": "Weight",
                                    "label": "weight",
                                    "v": 999,
                                    "unit": "kg"
                                },
                                {
                                    "id": 923,
                                    "title": "Other",
                                    "label": "blah",
                                    "v": 200,
                                    "unit": "mm"
                                }
                            ]
                        }
                    }
                }
            }
        ]
    }
]


此结果应该是您想要的。您可以在门户网站或代码中创建它。如有任何疑问,请告诉我。

希望对您有帮助。

关于javascript - 子元素上的Azure CosmosDB查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47307272/

10-12 17:27