没有字段名的MongoDB查询(mongodb query without field name)

2019-06-25 05:39发布

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

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

并想获得具有某个域的值是“苹果”的所有对象,但我不知道该字段的名称。 是否可以指定在MongoDB中查询到实现这一目标? (中的对象的数字键是儿童的ID,并且在对象的值是长的GUID)

Answer 1:

不幸的是,MongoDB的不支持查询各领域的特定值的任何方法。 有一个现有的吉拉票请求此增强: 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" },
      ]
    }

一旦你做到了这一点,您可以执行follwing查询找到所有需要的文件:

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

请注意,该模式允许你索引“tags.cid”和“tags.value”字段,你原来的模式不。

我希望这有帮助。

-威廉



Answer 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);


文章来源: mongodb query without field name