Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mongo DB查询:查找存储在Mongo中的映射是否包含特定值_Java_Mongodb - Fatal编程技术网

Java Mongo DB查询:查找存储在Mongo中的映射是否包含特定值

Java Mongo DB查询:查找存储在Mongo中的映射是否包含特定值,java,mongodb,Java,Mongodb,我有一个mongo系列,如下所示: { "id": "510aec8e8426e96c156a0946", "name": "ABC", "categoryToShardMap": null }, { "id": "510aecd284268e0f60e547a5", "name": "XYZ", "categoryToShardMap": { "shoes": 1 }, { "id":

我有一个mongo系列,如下所示:

    {
    "id": "510aec8e8426e96c156a0946",  
    "name": "ABC",
    "categoryToShardMap": null
    },
    {
    "id": "510aecd284268e0f60e547a5",
    "name": "XYZ",
    "categoryToShardMap": {
    "shoes": 1
    },
    {
    "id": "510aecbd84268e0f60e547a4",
    "name": "AAA",
    "categoryToShardMap": {
     "shoes": 3,
     "jeans": 2
     }
其中,我已将字段“categoryToShardMap”声明为:

    private HashMap<String, Long> categoryToShardMap;

我正在尝试使用java来实现这一点。但我不确定应该如何使用mongotemplate或DBObject查询这个问题。有人能给我举一些例子,说明如何查询存储在mongo文档中的映射是否包含指定的值吗?

您可以通过
$ne
操作符来执行此操作。只需检查该字段是否不为空

下面是一个如何使用javadriver实现这一点的示例

new BasicDBObject("categoryToShardMap", new BasicDBObject("$ne", null));
或者可以使用$where运算符检查数组的长度。下文对此进行了解释:

如果要在地图中查找特定值,可以使用以下命令:

DBObject query = BasicDBObjectBuilder.start().add("categoryToShardMap.shoes", 3).get(); // query for getting the documents whose "categoryToShardMap" field contains shoes with value 3

这有助于查找map是否为null。但是,如果我想检查地图中是否存在值“3”,此方法将不起作用。我编辑了我的问题,因为之前不清楚我是否在地图中查找特定值。我根据您的更改更新了我的答案。我建议您看看哪一个是Java中Mongo的对象文档映射器,它简化了Mongo与Java的使用。您能更新您的问题并指定这些要求吗。还请添加两个不同的文档,向我们显示您的确切查询内容。据我所知,您的碎片id将是您“categoryToShardMap”的密钥。假设碎片id为1,则可以使用类似于以下“categoryToShardMap.1”的符号而不是categoryToShardMap.1来搜索它。因此,您实际上可以对动态字段名进行查询。但正如我之前所说,请更新您的问题,并提供一些您将查询的真实文档。我遵循了您的建议。我使用shard id作为键而不是category,然后使用这个查询:newBasicDBObject(“shardLocategoryMap.+shard,newBasicDBObject($ne,null));现在可以了!谢谢你的帮助。
DBObject query = BasicDBObjectBuilder.start().add("categoryToShardMap.shoes", 3).get(); // query for getting the documents whose "categoryToShardMap" field contains shoes with value 3