XML-схема для элементов с тем же именем, но другой подструктурой в зависимости от контекста

Причина, по которой вы получаете эту ошибку, заключается в том, что вы пытаетесь вставить новый документ со значением a для индексированного ключа (где индексированный ключ помечен как Уникальный), который уже присутствует в одном из документов в MongoDB .

Если вы не проиндексировали ни один из ключей в явном виде, то вы должны включить поле «_id» также в документ при вставке, а поле «_id» должно иметь то же значение, что и ранее вставленный документ.

Пожалуйста, перейдите по ссылкам ниже:

https://docs.mongodb.com/manual/core/index-unique/

https : //docs.mongodb.com/manual/indexes/

6
задан gyrolf 17 October 2008 в 17:16
поделиться

2 ответа

Да, XSD может обработать это. Я генерировал эту схему из Visual Studio 2008 (намного быстрее, чем выполнение его вручную), и это сделает то, что Вы ищете:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="items">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="group">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="item">
                      <xs:complexType>
                        <xs:attribute name="name" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="name" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="data">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="group">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="customer">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="item">
                            <xs:complexType>
                              <xs:attribute name="name" type="xs:string" use="required" />
                              <xs:attribute name="count" type="xs:unsignedByte" use="required" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                        <xs:attribute name="name" type="xs:string" use="optional" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="name" type="xs:string" use="required" />
                  <xs:attribute name="place" type="xs:string" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
3
ответ дан 10 December 2019 в 02:55
поделиться

Ключевые пункты (см. Полиморфизм Времени выполнения XML-схемы через xsi:type и Абстрактные типы для полного и корректного контекста/размещения/использования):

  1. Создайте базовый тип с (краткий обзор = "верный", чтобы препятствовать тому, чтобы он использовался непосредственно)

    Примечание: касательно атрибута заменяет атрибут имени для элементов, определенных в другом месте

    <xs:complexType name="CustomerType" abstract="true" > 
      <xs:sequence> 
        <xs:element ref="cust:FirstName" /> 
        <xs:element ref="cust:LastName" /> 
        <xs:element ref="cust:PhoneNumber" minOccurs="0"/> 
      </xs:sequence> 
      <xs:attribute name="customerID" type="xs:integer" /> 
    </xs:complexType>
    
  2. Создайте два или больше производных типа путем расширения или ограничения базового типа

    <xs:complexType name="MandatoryPhoneCustomerType" > 
      <xs:complexContent> 
        <xs:restriction base="cust:CustomerType"> 
          <xs:sequence> 
            <xs:element ref="cust:FirstName" /> 
            <xs:element ref="cust:LastName" /> 
            <xs:element ref="cust:PhoneNumber" minOccurs="1" /> 
          </xs:sequence> 
        </xs:restriction> 
      </xs:complexContent> 
    </xs:complexType>
    

    и

    <xs:complexType name="AddressableCustomerType" > 
      <xs:complexContent> 
        <xs:extension base="cust:CustomerType"> 
          <xs:sequence> 
            <xs:element ref="cust:Address" /> 
            <xs:element ref="cust:City" /> 
            <xs:element ref="cust:State" /> 
            <xs:element ref="cust:Zip" /> 
          </xs:sequence> 
        </xs:extension> 
      </xs:complexContent> 
    </xs:complexType>
    
  3. Сошлитесь на базовый тип в элементе

    <xs:element name="Customer" type="cust:CustomerType" />
    
  4. В Вашем XML-документе экземпляра укажите определенный производный тип как атрибут xsi:type

    <cust:Customer customerID="12345" xsi:type="cust:MandatoryPhoneCustomerType" > 
      <cust:FirstName>Dare</cust:FirstName> 
      <cust:LastName>Obasanjo</cust:LastName> 
      <cust:PhoneNumber>425-555-1234</cust:PhoneNumber> 
    </cust:Customer>
    

    или:

    <cust:Customer customerID="67890" xsi:type="cust:AddressableCustomerType" > 
      <cust:FirstName>John</cust:FirstName> 
      <cust:LastName>Smith</cust:LastName> 
      <cust:Address>2001</cust:Address> 
      <cust:City>Redmond</cust:City> 
      <cust:State>WA</cust:State> 
      <cust:Zip>98052</cust:Zip> 
    </cust:Customer>
    
6
ответ дан 10 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: