$ 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
. По документации:
Оператор
$elemMatch
сопоставляет документы, содержащие поле массива, по крайней мере с одним элементом, который соответствует всем указанным критериям запроса.
Итак, этот запрос должен работать:
db.node_info.find({
nodes : {
$elemMatch : {
mac_address : { $ne : "-" }
}
}
})
Этот запрос должен быть переведен в BasicDBObject
с которым вы будете работать на Java. Это должно быть что-то вроде:
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
, соответствующие node_info
критериям, и будет включать вложенные документы массива, которые не соответствуют критериям.
Чтобы вернуть только вложенные mac_accress != "-"
документы, для которых mac_accress != "-"
, вам нужно выполнить агрегацию. Запрос агрегации в Монго:
db.node_info.aggregate([
{ $unwind : "$nodes" },
{ $project : { mac : "$nodes.mac_address" } },
{ $match : { mac : { $ne : "-" } } }
])
Это вернет только документы, для которых mac_address
не является "-"
. Конечно, вы выбираете другие поля документов, которые должны быть включены в результат. Для этого вам нужно перечислить нужные поля в стадии $project
.
Кроме того, этот запрос должен быть переведен в объект BasicDBObject
, но это можно сделать аналогично выше.
mac_address
в корне каждого документа. Так как ваши документы , кажется, не имеют это поле, оно имеет значение null
, которое не равно -
, поэтому все документы возвращаются.
node_info.aggregate(..)
переменнойDBCursor
?