$ ne。我错过了什么吗? 我的数据库如下。
其中包含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查询不是很熟悉。
答案 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
个对象中进行翻译,但这可以与上述类似。