Как сделать запрос по ссылочному полю в mongodb? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть 2 схемы монго:

Пользователь:

{
  _id: ObjectId,
  name: String,
  country: ObjectId // Reference to schema Country
}

Страна:

{
  _id: ObjectId,
  name: String
}

Я хочу, чтобы все пользователи имели название страны Вьетнам.

Какой запрос (только запрос к пользователю) я могу использовать для этого случая ??

Я хочу выглядеть так: SQL-запрос:

SELECT * 
FROM User
JOIN Country 
ON User.country = Country._id 
WHERE Country.name = VietNam

Ответы [ 4 ]

0 голосов
/ 12 февраля 2019

если вы хотите связать 2 или более коллекций, вы должны определить эталонный объект коллекции

мое решение, отметьте это https://mongoosejs.com/docs/populate.html

0 голосов
/ 12 февраля 2019

Вот код, который я обычно использую:

Models / users.js


const mongoose = require("mongoose");
const Countries = require("./countries");

const UsersSchema = new mongoose.Schema({
    name: Sting,
    country: Countries.schema
});

module.exports = mongoose.model("Users", UsersSchema);

controllers / users.js

const express = require("express");
const router = express.Router();
const Users = require("../models/users");

router.post("/register", async(req, res) => {
    try{
      const Me = await Users.create({name: req.body.name, country: req.body.country})
      /* If you make the request correctly on the frontend req.body.name is a 
         string and req.body.country is an object with one property, it's name */
      res.status(200).json({
          data: Me
      });
    }
    catch(err){
      res.status(400).json({message:err.message})


Поскольку подсхема является объектомВы упоминаете это как Me.country.name.Надеюсь, это поможет!

0 голосов
/ 12 февраля 2019

Вы можете использовать агрегацию ниже с mongodb 3.6 и выше

db.country.aggregate([
  { "$match": { "name": "VietNam" } },
  { "$lookup": {
    "from": Users.collection.name,
    "let": { "countryId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$country", "$$countryId" ] } } },
    ],
    "as": "users",
  }},
  { "$unwind": "$users" },
  { "$replaceRoot": { "newRoot": "$users" }}
])
0 голосов
/ 12 февраля 2019

В отличие от реляционных баз данных, это не то, в чем Mongo хорош, и вы обычно должны структурировать свои схемы по-другому, когда используете NoSQL.В этом случае вы можете добавить поле countryName в коллекцию user (и, возможно, индекс по стране), чтобы можно было запросить {countryName: "Vietnam"}.(Вместо названия страны, вероятно, было бы более разумно использовать код страны iso-2)

Если вам нужно выполнить соединение, вы можете использовать оператор $lookupв конвейере агрегации - просто имейте в виду, что агрегаты плохо масштабируются и, как правило, их сложно написать.

...