【问题标题】:MongoDB $and queryMongoDB $和查询
【发布时间】:2020-04-01 12:29:45
【问题描述】:

我想要在 MongoDB 中执行以下操作的查询:

  • 返回的文档profession.organization 属性可以是字符串'bank'。
  • 返回的文档profession.city 属性可以是字符串“NY”。
  • 但是,如果文档中“profession.organization”为“bank”,“profession.city”为“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();

【问题讨论】:

  • 所以现在它不起作用?你最后得到了什么文件?
  • 不,它不起作用。我既没有得到组织“银行”,也没有得到城市“纽约”
  • 那么,最后,每个文档都必须有profession.organization作为bank
  • 编辑了我的答案,现在应该更清楚了
  • 因此,您需要所有文档中的示例文档,这样每个文档都没有这两个属性。看我的回答。

标签: javascript mongodb mongodb-query


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    我认为在接受的答案中使用的查询可能要短得多。

    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"
        }
      }
    

    【讨论】:

    • 我得到了这个 errmsg: 'unknown top level operator: $elemMatch',
    【解决方案3】:

    不幸的是,在撰写本文时,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'
        }
      ]
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多