【问题标题】:mongodb query without field name没有字段名的mongodb查询
【发布时间】:2015-01-16 02:37:16
【问题描述】:

我想查询所有具有包含特定值的字段的对象。例如,我有两个文档:

{"123": "apple", "217": "pear", "179": "orange"}
{"831": "pear", "189": "grapes"}

并且想获取所有具有值为“apple”的字段的对象,但我不知道该字段的名称。是否可以在 MongoDB 中指定一个查询来实现这一点? (对象中的数字键是子id,对象中的值是长GUID)

【问题讨论】:

    标签: mongodb advanced-queuing


    【解决方案1】:

    不幸的是,MongoDB 不支持任何查询具有特定值的所有字段的方法。现有的 Jira 票证要求此增强功能:https://jira.mongodb.org/browse/SERVER-1248。随意评论、投票或关注该票。

    与此同时,通常的处理方式是更改 MongoDB 架构。对于您的示例,您将更改现有架构:

    {"123": "apple", "217": "pear", "179": "orange"} 
    {"831": "pear", "189": "grapes"} 
    

    你可以像这样构造它:

     { tags: [
            { cid: "123", value: "apple" },
            { cid: "217", value: "pear" },
            { cid: "179", value: "orange" },
          ]
        }
       { tags: [
            { cid: "831", value: "pear" },
            { cid: "189", value: "grapes" },
          ]
        }
    

    完成此操作后,您可以执行以下查询以查找所有所需的文档:

     db.docs.find( {'tags.value': "apple" } )
    

    请注意,此架构允许您索引 'tags.cid' 和 'tags.value' 字段,而您的原始架构没有。

    我希望这会有所帮助。

    -威廉

    【讨论】:

      【解决方案2】:

      您可以在所有字段上使用全文索引。

      use dbname
      db.collectionname.ensureIndex(
                                 { "$**": "text" },
                                 { name: "TextIndex" }
                               )
      

      然后使用搜索:

      DB db = mongoClient.getDB("dbname");
      DBCollection coll = db.getCollection("collectionname");
      BasicDBObject query = new BasicDBObject();
                  query.append("$text", new BasicDBObject("$search", searchstring));
                  DBCursor cursor = coll.find(query);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多