Как выполнить поиск полного соответствия с двумя параметрами? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть модель базы данных

Schema({
  members: [
    {
      type: String,
      required: true,
      ref: "User"
    }
  ],
  createdAt: {
    type: Date,
    default: Date.now(),
    required: true
  },
  lastMessage: {
    message: {
      type: String,
      required: true
    },
    from: {
      type: String,
      required: true
    },
    createdAt: {
      type: Date,
      required: true
    }
  },
  messages: [
    {
      createdAt: {
        type: Date,
        required: true
      },
      message: {
        type: String,
        required: true
      },
      from: {
        type: String,
        ref: "User",
        required: true
      }
    }
  ]
});

Этот код я использую, чтобы найти некоторые документы

Chats.countDocuments(
      {
        members: {
          $in: ["userIdOne", "userIdTwo"]
        }
      },
      cb
    )

Я использую $in, чтобы найти данные, которые мне нужны, но $in найти все документы, которые содержат один из этих userId ... . Мне нужно найти только один документ, который содержит идентификаторы этого пользователя.

Как я могу это сделать?

Ответы [ 2 ]

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

Используйте $ all вместо

Chats.countDocuments(
  {
    members: {
      $all: ["userIdOne", "userIdTwo"]
    }
  },
  cb
)
0 голосов
/ 12 марта 2020

Если вам нужно точное совпадение, вы можете использовать $ setEquals оператор агрегирования.

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $eq: [
          {
            $setEquals: [
              "$members",
              [
                "userIdOne",
                "userIdTwo"
              ]
            ]
          },
          true
        ]
      }
    }
  },
  {
    $count: "count"
  }
])

Ввод:

[
  {
    "members": [
      "userIdOne"
    ]
  },
  {
    "members": [
      "userIdTwo"
    ]
  },
  {
    "members": [
      "userIdOne",
      "userIdTwo"
    ]
  },
  {
    "members": [
      "userIdOne",
      "userIdTwo",
      "userIdThere"
    ]
  }
]

Выход:

[
  {
    "count": 1
  }
]

Детская площадка

Вы можете интегрировать это в пн goose следующим образом:

  const result = await Chats.aggregate([
    {
      $match: {
        $expr: {
          $eq: [
            {
              $setEquals: ["$members", ["userIdOne", "userIdTwo"]]
            },
            true
          ]
        }
      }
    },
    {
      $count: "count"
    }
  ]);

  const count = result[0].count;
...