猫鼬查询与嵌套对象的OR比较会返回一个空数组

时间:2019-06-07 21:38:07

标签: node.js mongodb mongoose

我有一个具有以下结构的集合:

{
    _id
    someParamA,
    someParamB,
    someParamC: {
        nestedParamA,
        nestedParamB,
        nestedParamC,
    }
}

我想做的是查询数据库,并返回所有具有someParamC视图不同值之一的记录。

例如,查询将类似于:

其中(someParamC:{nestedParamA:1,nestedParamB:1,nestedParamC:1})或(someParamC:{nestedParamA:1,nestedParamB:1,nestedParamC:2}

我已经用以下代码尝试过此操作:

Collection.find().or([{someParamC: {...}}, {someParamC: {...}}]

每条猫鼬的调试消息会产生如下查询:

{
  "dbQuery": {
    "coll":  "collectionName","method":"find","query": {"$or":[{"someParamC":{...}},{"someParamC":{...}]},"doc":{"sort":{"updatedAt":-1},"projection":{}}
  }
}

这正是我所期望的。即使馆藏有多个匹配的文档,Mongoose总是返回[]。

我也曾尝试将过滤器放在{fin或{}的.find()方法中无济于事。当调用.findOne()时,这一切也都失败了。我在这里做错什么了吗?我的特定代码,收集和日志记录如下:

cacheResult = await resultsCollection.find()
  .or(<array of parameters, see below>)
  .sort({ updatedAt: -1 });

参数数组如下:

[
  {
    "requestParameters":{
      "action":"product",
      "domainId":1,
      "ASIN":"B0763ZCH7K",
      "offers":true,
      "rating":true
    }
  },
  {
    "requestParameters":{
      "action":"product",
      "domainId":1,
      "ASIN":"B0763ZCH7K",
      "offers":true,
      "rating":false
    }
  },
  {
    "requestParameters":{
      "action":"product",
      "domainId":1,
      "ASIN":"B0763ZCH7K",
      "offers":false,
      "rating":true
    }
  },
  {
    "requestParameters":{
      "action":"product",
      "domainId":1,
      "ASIN":"B0763ZCH7K",
      "offers":false,
      "rating":false
    }
  }
]

哪个生成此请求(猫鼬调试信息):

{
  "dbQuery":{
    "coll":"public.keepas",
    "method":"find",
    "query":{
      "$or":[
        {
          "requestParameters":{
            "action":"product",
            "domainId":1,
            "ASIN":"B0763ZCH7K",
            "offers":true,
            "rating":true
          }
        },
        {
          "requestParameters":{
            "action":"product",
            "domainId":1,
            "ASIN":"B0763ZCH7K",
            "offers":true,
            "rating":false
          }
        },
        {
          "requestParameters":{
            "action":"product",
            "domainId":1,
            "ASIN":"B0763ZCH7K",
            "offers":false,
            "rating":true
          }
        },
        {
          "requestParameters":{
            "action":"product",
            "domainId":1,
            "ASIN":"B0763ZCH7K",
            "offers":false,
            "rating":false
          }
        }
      ]
    },
    "doc":{
      "sort":{
        "updatedAt":-1
      },
      "projection":{

      }
    }
  }
}

哪一个返回[],即使这在数据库中: Screen shot of some DB records that should match

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用猫鼬,我为一个带有未定义参数的OR子句传递了一个对象。尽管此参数没有出现在Mongoose调试输出中(即,它根本没有包含在查询字符串中),但删除该参数可以神奇地解决了该问题,并且查询现在可以按预期运行。