如何使用$ ne使用mongodb java获取数据用于带数组的文档。

时间:2015-04-09 07:19:00

标签: java mongodb mongodb-query mongo-java

使用java没有给出正确结果的momgodb中的

$ ne。我错过了什么吗? 我的数据库如下。 enter image description here

其中包含mac_address = "-".

的值

我的代码,用于检索mac_address != "-"所在的记录,

BasicDBObject whereQuery = new BasicDBObject("mac_address", new BasicDBObject("$ne", "-"));
DBCursor cursor = node_info.find(whereQuery);

它将返回所有记录。什么可能是错的。?

更新 我将您建议的查询转换如下。这有什么不对?

    BasicDBObject unwind= new BasicDBObject("$unwind","$nodes");
    BasicDBObject mac = new BasicDBObject("mac_address", "$nodes.mac_address");
    BasicDBObject projection= new BasicDBObject("$project",mac);
    BasicDBObject match = new BasicDBObject("$match", new     BasicDBObject("mac_address",notEqual));
   node_info.aggregate(unwind, projection, match);

抱歉,我对mongodb查询不是很熟悉。

1 个答案:

答案 0 :(得分:3)

据我所知,nodes是一个嵌套数组,你不是查询它的属性。

为了按嵌套数组的属性进行过滤,您必须使用$elemMatch运算符。通过文档:

  

$elemMatch运算符匹配包含数组字段的文档,其中至少有一个元素符合所有指定的查询条件。

所以,这个查询应该有效:

db.node_info.find({ 
  nodes : { 
    $elemMatch : { 
      mac_address : { $ne : "-" } 
    } 
  }
})

此查询必须翻译到您将使用Java工作的BasicDBObject。它应该是这样的:

BasicDBObject query = new BasicDBObject();
BasicDBObject notEqual = new BasicDBObject("$ne", "-");
BasicDBObject macCriteria = new BasicDBObject("mac_address", notEqual);
BasicDBObject elemMatch = new BasicDBObject("$elemMatch, macCriteria);
query.put("nodes", elemMatch);

<强>更新

上述解决方案的问题在于查询实际上将返回与提供的条件匹配的所有node_info文档,而包含与条件不匹配的嵌套数组文档。

为了返回嵌套数组文档,mac_accress != "-",您必须进行聚合。 Mongo中的聚合查询将是:

db.node_info.aggregate([
    { $unwind : "$nodes" },
    { $project : { mac : "$nodes.mac_address" } },
    { $match : { mac : { $ne : "-" } } }
])

这将只返回mac_address不是"-"的文档。当然,您选择要包含在结果中的文档的其他字段。为此,您必须枚举$project管道阶段中的所需字段

此外,此查询必须在BasicDBObject个对象中进行翻译,但这可以与上述类似。