создание формы регистрации

Итак, давайте начнем с упрощения набора данных, вставим список элементов в нашу коллекцию test:

var items = [{
  _id : 1,
  products: [
    {
      countryId: 1 
    },
    {
      countryId: 1
    },
    {
      countryId: 2
    },
    {
      countryId: 4
    },
  ],
  sellers: [
    {
      countryId: 2
    },
    {
      countryId: 2
    },
    {
      countryId: 1
    }
  ]  
},
{
  _id : 2,
  products: [
  {
    countryId: 2
  },
  {
    countryId: 2
  },
  {
    countryId: 3
  }
  ],
  sellers: [
  {
    countryId: 3
  },
  {
    countryId: 3
  },
  {
    countryId: 2
  },
  {
    countryId: 4
  }
  ]
}];

db.test.insertMany(items);

Затем мы можем использовать этап агрегации $facet для обработки нескольких конвейеры агрегации, так что давайте начнем с использования конвейера для productsOnCountryCount.

Для начала нам нужно развернуть все products в массиве, а затем сопоставить, затем на основе заданного идентификатора страны:

var countryId = 4;

db.test.aggregate([
  { "$unwind" : "$products" },
  { "$match" : { "products.countryId": countryId } }
]).pretty()
{
        "_id" : 1,
        "products" : {
                "countryId" : 4
        },
        "sellers" : [
                {
                        "countryId" : 2
                },
                {
                        "countryId" : 2
                },
                {
                        "countryId" : 1
                }
        ]
}

Теперь мы можем просто использовать счет в конце, чтобы получить количество всех продуктов:

db.test.aggregate([
  { "$unwind" : "$products" },
  { "$match" : { "products.countryId": countryId}},
  { "$count": "productsOnCountryCount" }])
{ "productsOnCountryCount" : 1 }

Это наш первый отсортированный конвейер, теперь давайте посмотрим на unavailableProductsCount:

Все, что нам нужно сделать, это сопоставить, где countryId находится в [ 1110], но не в массиве products, это может быть достигнуто простым этапом $match, тогда мы можем просто запустить подсчет сверху:

db.test.aggregate([
    { "$match" : {"sellers.countryId": countryId, "products.countryId" : { $ne: countryId } } },
    { "$count": "unavailableProductsCount" }])
{ "unavailableProductsCount" : 1 }

Теперь у нас есть два конвейера Теперь мы можем использовать стадию $facet, чтобы соединить их вместе, а затем спроецировать их в более приятную форму:

db.test.aggregate([
  { "$facet": {
    "productsOnCountryCount": [
      { "$unwind" : "$products" },
      { "$match" : { "products.countryId": countryId}},
      { "$count": "productsOnCountryCount" },
    ],
    "unavailableProductsCount": [
      { "$match" : {"sellers.countryId": countryId, "products.countryId" : { $ne: countryId } } },
      { "$count": "unavailableProductsCount" }
    ]
  }},
  { "$project": {
    "productsOnCountryCount": { "$arrayElemAt": ["$productsOnCountryCount.productsOnCountryCount", 0] },
    "unavailableProductsCount": { "$arrayElemAt": ["$unavailableProductsCount.unavailableProductsCount", 0] }
  }}
]);

{ "productsOnCountryCount" : 1, "unavailableProductsCount" : 1 }

Я считаю, что лучший способ использовать $facet - это просто разбить их на сначала трубы меньшего размера, а затем соедините их вместе в конце.

5
задан masfenix 5 January 2009 в 21:07
поделиться

4 ответа

Этот вид приложения был сделан 1000x времена. Используйте одного из них. Evite, если Вы должны.

Или одна из этих альтернатив Evite.

Или, используйте Google App Form. Творит чудеса для маленьких событий.

6
ответ дан 14 December 2019 в 13:49
поделиться

Если Вам нравится строить диаграмму проектов как это сначала, Вам мог бы понравиться Планировщик продукта. У них есть тонны существующих регистрационных шаблонов там также.

0
ответ дан 14 December 2019 в 13:49
поделиться

Сохраните список вопросов и введите типы: текстовое поле, текстовая область, и т.д. Затем получите список вопросов с идентификатором формы при создании формы, вставке HTML на основе типа вопроса. Затем храните данные назад в базу данных, когда пользователь отправит форму идентификатором формы и идентификатором вопроса.

-1
ответ дан 14 December 2019 в 13:49
поделиться

База данных, которая хранит, какие вопросы идут с который типы форм. Веб-интерфейс для отображения соответствующей формы для данного события. Второй веб-интерфейс для их администратора для легкого просматривания/добавления/удаления вопросов каждому типу формы.

1
ответ дан 14 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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