Считать, только если не в массиве

У меня есть коллекции документов, в которых есть массив:

{
  "_id": {
    "$oid": "5b602207a2f56b05028038c1"
  },
  "groupId": "5b32929cfc37de04f3ce9004",
  "updated": 20180731084703,
  "data": {
    "type": "WallStory",
    "playerId": "5b6003ca031f5bc44d59bb7b",
    "time": "0847",
    "story": "This is my new atory...",
    "reads": [
      "5b6003ca031f5bc44d59bb7b"
    ]
  }
}

Теперь я хочу иметь возможность подсчитать все документы, у которых нет идентификатора пользователя в массиве "reads". Я не знаю, как это сделать?

Я думаю примерно так, но мне это не удается:

var newStories = 0;
newStories += dbCollection('groupWallStories').count({"groupId": "5b32929cfc37de04f3ce9004", "data.reads": thisUserId }).sort({"updated": -1}).limit(10);

Надеюсь, кто-нибудь сможет направить меня в правильном направлении, и заранее спасибо :-)

Покажите образец ожидаемого результата?

Clement Amarnath 31.07.2018 11:27
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
1
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы получаете лучшую производительность от простого запроса count() с оператором $ne

dbCollection('groupWallStories').count({ "data.reads": { "$ne": thisUserId } })

Или с агрегацией вы можете использовать здесь $setIsSubset и $cond:

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "count": {
      "$sum": {
        "$cond": {
          "if": {
            "$setIsSubset": [
              [ "5b6003ca031f5bc44d59bb7b" ],
              "$data.reads"
            ]
          },
          "then": 1,
          "else": 0
        }
      }
    }
  }}
])

Вам также необходимо «преобразовать» с помощью id из «строки» в действительный ObjectId в совокупности.

Отлично ... Работает как шарм :-)

Mansa 31.07.2018 11:53

Другие вопросы по теме