Как использовать $ ne для получения данных, используя mongodb java для документа с массивом.?

1

$ ne в momgodb, используя java, не давая должного результата. Я что-то упускаю? Моя база данных следующая. Изображение 174551

Который содержит значение, где 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
    Вы присвоили результат node_info.aggregate(..) переменной DBCursor ?
  • 0
    Тип возвращаемого значения агрегатной функции - AggreggationOutput. я не могу этого сделать
Показать ещё 1 комментарий
Теги:
mongodb-query
mongo-java

1 ответ

3
Лучший ответ

Насколько я вижу, 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, но это можно сделать аналогично выше.

  • 2
    @HiteshVaghani Как дополнительная информация: вы запрашивали поля mac_address в корне каждого документа. Так как ваши документы , кажется, не имеют это поле, оно имеет значение null , которое не равно - , поэтому все документы возвращаются.
  • 0
    Я пробовал этот запрос {"node": {"$ elemMatch": {"mac_address": {"$ ne": "-"}}}}. Это дает тот же результат, что и раньше.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню