如何使用 $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
个对象中 翻译,但这可以与上面类似地完成。
$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
个对象中 翻译,但这可以与上面类似地完成。