【问题标题】:Mongodb find all records where subfields in a given set in PHPMongodb在PHP中查找给定集中子字段的所有记录
【发布时间】:2014-11-23 08:53:26
【问题描述】:

我有一个看起来像这样的文档 { "field1":"value1", "field2":{"unknown_key1":"value2", "unknown_key2":"value3", ... "unknown_keyN":"valueN"} }

还有一个数组("arr1","arr2","arr3")

我想查询以查找所有未知键都在我的数组定义的集合中的所有文档,除了这些键的数量 N 并且它们的值未知。这在 Mongodb 中是否可行,如果可以,我将如何去做。

【问题讨论】:

  • 你的数组是否包含这个数组("unknown_key1","unknown_key2",....,""unknown_keyN")?
  • 没有我的数组包含其他键 我想查找所有未知键都是数组中其他键之一的所有文档
  • 这意味着数组中存在一些未知键对吗?
  • 我试图查询它们是否在数组中,我不知道它们是否一定
  • 将数据用作键或具有“未知”键是糟糕的数据建模。或者,您可以将每个 unknown_key、值对变成一个对象 { "key" : "unknown_key", "value" : "value" } 并让 field2 成为这些对象的数组。在这种情况下,您应该查看this old SO answer 来解决您的问题。

标签: php mongodb


【解决方案1】:

根据您的问题,我认为您的数组中存在一些 unknown_key 假设如果您的数组包含以下值,

var values = ("arr1","arr2","arr3",..."unknown_key1","unknown_key2",.."arrN")

如果正确,那么您应该使用以下查询来查找

for( i = 0; i < values.length ; i++ ) {
db.collectionName.find({},{"field2."+values[i]:1})
 } 

【讨论】:

    【解决方案2】:

    我对 PHP 不是很熟悉,但您通常在其他语言中所做的是使用对象数组,然后为此使用子符号。

    例如:

    "field1":"value1",
    "field2":[
        {"unknown_key1":"value2"},
        {"unknown_key2":"value3"}
         ...
        {"unknown_keyN":"valueN"}
        ]
    

    然后你可以通过

    找到它们
    ...find({"field2.unknown_key1": "value2", ... })
    

    在此处查看另一个示例Mongo Query on Subfields

    【讨论】:

    • 当我不知道 unknown_key1 是什么时,我怎么能找到 field2.unknown_key1
    【解决方案3】:

    在这种情况下,您可以使用$where。如果任何未知键应该在数组定义的集合中:

    db.collection_name.find({$where: function() {
      var myarr = ["unknown_key", "arr1", "arr2", "arr3"];
      for(var key in this.field2) {
        var subkey = key.substr(0, key.length-1); //get unknown_key from unknown_keyN
        var id = myarr.indexOf(subkey); // check if in array 
        if (id != -1) return true;
      }
      return false;
    }})
    

    如果所有未知键都应该在数组定义的集合中:

    db.collection_name.find({$where: function() {
      var myarr = ["unknown_key", "arr1", "arr2", "arr3"];
      if (this.field2  != undefined) {
        for(var key in this.field2) {
          var subkey = key.substr(0, key.length-1); //get unknown_key from unknown_keyN
          var id = myarr.indexOf(subkey); // check if in array 
          if (id == -1) return false;
        } 
        return true;
      } else {
        return false;
      }
    }})
    

    【讨论】:

    • $where 查询可能非常慢。最好更改文档以满足更好的搜索查询
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 2016-07-29
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多