Объединение двух $ существует в MongoDB .find - PullRequest
1 голос
/ 26 марта 2020

Я хотел бы найти документы, содержащие некоторые поля, используя $exists. В частности, меня интересуют два поля: payload.fields.MDI_CC_DIAG_DTC_LIST и payload.asset.

Если я хочу найти только документы, содержащие первое, это мой запрос:

db.getCollection("dtc").find({"payload.fields.MDI_CC_DIAG_DTC_LIST": {$exists: true}}).count()

Это дает мне 2265 документов.

Когда я пытаюсь найти документы, которые содержат два поля (описанные выше), я использую этот код:

db.getCollection("dtc").find({"payload.fields.MDI_CC_DIAG_DTC_LIST": {$exists: true}}, {"payload.asset": {$exists: true}}, {multi: true})count()

Это выдает мне ошибку:

Не удалось получить документы

[coches.dtc@ localhost:27017 [direct]] : An error occurred while retrieving documents!

Stacktrace: 
|_/ java.lang.Exception: [coches.dtc@ localhost:27017 [direct]] : An error occurred while retrieving documents!
|____/ Illegal argument: Invalid number of arguments to find().

Что я неправильно кодирую?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Ваш запрос имеет несколько проблем, попробуйте ниже одной:

db.getCollection("dtc")
  .find({
    "payload.fields.MDI_CC_DIAG_DTC_LIST": { $exists: true },
    "payload.asset": { $exists: true }
  })
  .count();

Проблемы:

  1. .find () будет принимать два аргумента .find({...},{...}), первый из которых будет фильтром (все фильтры для коллекции go здесь), а второй - проекцией (который используется для исключения или включения определенных полей из итоговых документов). Здесь вы проходите в 3-х аргументах. Но в целом, когда дело доходит до node.js 3-й, это может быть функция обратного вызова, но это не имеет ничего общего с фактическим запросом, выполняемым в базе данных.
  2. Не существует такой вещи, называемой {multi: true} по .find(). multi будет передано как 3-й параметр / arg .update () операций для обновления нескольких документов, соответствующих отфильтрованным критериям.
1 голос
/ 26 марта 2020

Это просто опечатка. Вместо добавления другого свойства в ваш запрос, вы передали его в качестве второго аргумента find.

Попробуйте:

/* ... */ true}}, {"payload.asset" /* ... */
/* ... */ true},   "payload.asset" /* ... */
...