есть ли запрос для поиска документов путем проверки поля вложенного внедренного документа в mongoDb - PullRequest
1 голос
/ 26 февраля 2020

Вот моя схема продукта.

const Products: Schema = new Schema({
storeId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'store',
    required: true
},
invoiceId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'invoice'
},
unitPrice: { type: Number },
quantity: { type: Number },

}, { timestamps: true });

Вот мой инвойс cie схема

const invoice: Schema = new Schema({
customer: { type: String, default: null },

netTotal: { type: Number },
paid: { type: Number },
type: { type: String },

}, { timestamps: true });

Я хочу найти продукты, в которых типом документа invoiceId является «продажа». Поскольку invoiceId - это встроенный документ документа продукта, содержащий сведения о счете.

Я попытался заполнить, но он не работает.

Products.find().populate({path : "invoiceId" , match : {type : "sale"} });

Но это не работает и дает всем документам только заполнить invoiceId тех, которые являются "продажей".

Любая помощь будет оценена.

1 Ответ

1 голос
/ 27 февраля 2020

Отказ от ответственности : я еще не использовал Mon goose, но в комментариях вы сказали, что запрос mongodb также будет полезен.

На основе схем Mon goose Вы описали, я смоделировал 10 документов для продуктов и 3 для счетов, используя Mockeroo (https://mockaroo.com/). Обратите внимание, что objectId здесь просто воспринимаются как целые числа, но запрос должен работать так же хорошо, если все идентификаторы являются objectIds.

Products :

{
  "_id": 1,
  "storeId": 1,
  "invoiceId": 3,
  "unitPrice": 127,
  "quantity": 21,
  "timestamp": "1558330027"
},
{
  "_id": 2,
  "storeId": 2,
  "invoiceId": 2,
  "unitPrice": 140,
  "quantity": 25,
  "timestamp": "1552293229"
},
{
  "_id": 3,
  "storeId": 1,
  "invoiceId": 2,
  "unitPrice": 192,
  "quantity": 80,
  "timestamp": "1576270154"
}, //and so on...

Счета-фактуры :

{
  "_id": 1,
  "customer": "Y-find",
  "netTotal": 1,
  "paid": true,
  "type": "stale"
},
{
  "_id": 2,
  "customer": "Namfix",
  "netTotal": 72,
  "paid": true,
  "type": "sale"
},
{
  "_id": 3,
  "customer": "Opela",
  "netTotal": 67,
  "paid": false,
  "type": "fail"
}

Поскольку каждый продукт хранит один invoiceId, продукты-счета-фактуры являются отношением многие-к-одному (так как многие продукты могут иметь один и тот же invoiceId и, следовательно, принадлежать Однако в том же счете мы не храним конкретную ссылку на продукты в счетах, и каждый продукт имеет только один счет-фактуру, поэтому один продукт должен принадлежать только одному счету.

Наша цель - написать запрос чтобы получить все продукты, где тип счета-фактуры "продажа". Для этого я написал следующее агрегирование:

db.products.aggregate([
{
    $lookup: {
        "from": "invoices",
        "let": {
            inv_id: "$invoiceId"
        },
        "pipeline": [
        {
            $match: {
                $expr: {
                    $eq: [
                        "$$inv_id",
                        "$_id"
                    ]
                }
            }
        }
        ],
        as: "invoice"
    }
  },
  {
      $unwind: {
          path: "$invoice"
      }
  },
  {
      $match: {
        "invoice.type": "sale"
      }
  },
  {
      $unset: "invoice"
  }
])

Я вставил фиктивные данные в Mongoplayground и опробовал, вот оно: https://mongoplayground.net/p/K8ciQ-Ei12P

Обратите внимание, что последний этап $ unset предназначен только для того, чтобы убедиться, что все документы в результате являются только документами продукта без подробных данных счета-фактуры (так как это было необходимо).

Надеюсь, это помогло. Если у кого-либо есть какие-либо оптимизации, на которые можно указать, или они могут преобразовать их в Mon goose, не стесняйтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...