Как найти документы, содержащие поле, содержащее любые подполя - PullRequest
1 голос
/ 15 апреля 2020

У меня есть документы с полем attributes. Примерно так:

{
    "_id" : "somestring",
    ...,
    "attributes" : {
        "SomeKey" : {
            "code" : "SomeCode",
            "name" : "SomeName",
        }
    }
}

Как найти все документы с полем attributes, имеющим 1 или более подполей?

Соответствующий документ будет соответствовать, а приведенный ниже документ не будет.

{
    "_id" : "somestring",
    ...,
    "attributes" : {}
}

Я знаю, как запросить для массивов, которые имеют ряд элементов, и запросить документы, которые имеют поле, которое имеет некоторое указанное c подполе, но я смотрю для документа, который имеет поле, которое имеет любые подполя.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вместо использования $where для выполнения .js кода через запрос, вы можете использовать try, как показано ниже:

db.collection.aggregate([
  {
    $match: {
      attributes: {
        $ne: {}
      }
    }
  }
])

/** Or with `.find()` */

db.collection.find({ attributes: { $ne: {} } });

Тест: MongoDB-Playground

На всякий случай, если у вас нет attributes вообще или он существует, но не объект, то:

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          { $eq: [ { $type: "$attributes" } , "object" ] },
          { $ne: ["$attributes" , {} ] }
        ]
      }
    }
  }
])

/** Or with `.find()` */
db.collection.find({
  $expr: {
    $and: [
      { $eq: [{ $type: "$attributes" }, "object"] },
      { $ne: ["$attributes", {}] },
    ],
  },
});

Тест: MongoDB-площадка

0 голосов
/ 15 апреля 2020

Я нашел механизм, который использует $where, но он может работать медленно, потому что он Javascript. Ни один из других встроенных операторов не подходит.

db.getCollection('COL')
  .find({
      $where: function() {
        for (field in this["attributes"])
          return true;
        return false;
      }
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...