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

How to use $ne for getting data using mongodb java for document with array.?

$ne 在 momgodb 中使用 java 没有给出正确的结果。我错过了什么吗? 我的数据库如下。

其中包含 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 查询不太熟悉。

据我所知,nodes 是一个嵌套数组,您没有 属性 查询它。

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

The $elemMatch operator matches documents that contain an array field with at least one element that matches all the specified query criteria.

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

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

更新:

上述解决方案的问题是查询实际上 return 所有符合提供条件的 node_info 文档并且 包含嵌套的排列不符合条件的文档。

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

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

这将仅 return mac_address 不是 "-" 的文档。当然,你select文件的其他字段也要包含在结果中。为此,您必须在 $project 管道阶段枚举所需的字段 .

此外,此查询必须在 BasicDBObject 个对象中 翻译,但这可以与上面类似地完成。