Mam model bazy danych

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
      }
    }
  ]
});

Tego kodu używam do wyszukiwania dokumentów

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

Używam $in, aby znaleźć potrzebne mi dane, ale $in znajduję wszystkie dokumenty zawierające jeden z tego userId ... . Muszę znaleźć tylko jeden dokument zawierający identyfikatory tego użytkownika.

W jaki sposób mogę to zrobić?

0
bpGusar 12 marzec 2020, 12:24

2 odpowiedzi

Najlepsza odpowiedź

Zamiast tego użyj $ all

Chats.countDocuments(
  {
    members: {
      $all: ["userIdOne", "userIdTwo"]
    }
  },
  cb
)
1
Valijon 12 marzec 2020, 09:32

Jeśli potrzebujesz dopasowania ścisłego, możesz użyć $ setEquals operator agregacji.

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

Wejście:

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

Wynik:

[
  {
    "count": 1
  }
]

Plac zabaw

Możesz to zintegrować z mangustą w następujący sposób:

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

  const count = result[0].count;
0
SuleymanSah 12 marzec 2020, 09:58