MongoDB $ и запрос - PullRequest
       0

MongoDB $ и запрос

2 голосов
/ 01 апреля 2020

Мне нужен запрос в MongoDB, который выполняет следующие действия:

  • Возвращенный документ profession.organization Свойство может быть строкой 'bank'.
  • Возвращенный документ profession.city Аргументом свойства может быть строка «NY».
  • Однако, если в документе есть «банк» для «профессио. организация» и «NY» для «профессия.город», документ должен быть исключен.

Для суммирования документа можно указать город 'NY' или организацию 'банк', но его необходимо исключить, если он одновременно обладает этими свойствами.

То, что я пробовал до сих пор.

    targetObj = await db.db(MDBC.db).collection(MDBC.pC)
        .aggregate([{
            $match: {
                $and: [
                { 'profession.organization': { $ne: 'bank' } }, 
                { 'profession.city': { $ne: 'NY' } }
              ]
            }
        }, { $sample: { size: 1 } }]).next();

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Попробуйте это:

targetObj = await db.db(MDBC.db).collection(MDBC.pC)
 .aggregate([
  {
    $match: {
      $and: [
        {
          $or: [
            { "profession.organization": "bank" },
            { "profession.city": "NY" }
          ]
        },
        {
          $or: [
            {
              "profession.organization": "bank",
              "profession.city": { $ne: "NY" }
            },
            {
              "profession.organization": { $ne: "bank" },
              "profession.city": "NY"
            }
          ]
        }
      ]
    }
  },
  { $sample: {size: 1} } ]).next();

MongoPlayground

0 голосов
/ 01 апреля 2020

К сожалению, на момент написания, в MongoDB не было оператора соответствия, который бы помог с этим. Но вы можете достичь аналогичного результата, комбинируя операторы $or и $ne. Попробуйте что-то вроде этого для вашего запроса:

const query = {
  $or: [
    {
      // Include all non-banks outside of NY.
      'profession.city': { $ne: 'NY' },
      'profession.organization': { $ne: 'bank' }
    },
    {
      // Include all non-banks in NY.
      'profession.city': 'NY',
      'profession.organization': { $ne: 'bank' }
    },
    {
      // Include all banks outside of NY.
      'profession.city': { $ne: 'NY' },
      'profession.organization': 'bank'
    }
  ]
};
0 голосов
/ 01 апреля 2020

Я думаю, что запрос, который используется в принятом ответе, может быть намного короче.

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          "profession.organization": "bank",
          "profession.city": {
            $ne: "NY"
          }
        },
        {
          "profession.organization": {
            $ne: "bank"
          },
          "profession.city": "NY"
        }
      ]
    }
  },
  {
    $sample: {
      size: 1
    }
  }
])

и еще одна вещь, которую я хочу сказать, - если вы также хотите включить документы, которые не имеют либо из этих двух свойств вы должны использовать это:

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          "profession.organization": "bank",
          "profession.city": {
            $ne: "NY"
          }
        },
        {
          "profession.organization": {
            $ne: "bank"
          },
          "profession.city": "NY"
        },
        {
          "profession.organization": {
            $ne: "bank"
          },
          "profession.city": {
            $ne: "NY"
          }
        }
      ]
    }
  },
  {
    $sample: {
      size: 1
    }
  }
])

это также будет включать документы, такие как -

  {
    "profession": {
      "organization": "someBank",
      "city": "notNA"
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...