Обращение родительского ребенка в результате - PullRequest
0 голосов
/ 04 октября 2018

Я использую MongoDB 3.4.

Имею 2 коллекции следующим образом.

Коллекция 1: - type

{
  "_id": {
    "$numberLong": "1234"
  },
  "name" : "board1"
  "type" : "electronic"
},
{
  "_id": {
    "$numberLong": "1235"
  },
  "name" : "board2",
  "type" : "electronic"
}

Коллекция 2: - продукты

{
  "_id": {
    "$numberLong": "9876"
  },
  "types" : [
     "1234",
     "1235",
     "1238"
   ]
},
{
  "_id": {
    "$numberLong": "9875"
  },
  "types" : [
     "1234",
     "1238"
   ]
}

Коллекция типов будет иметь несколько типов, и каждый продукт в коллекции продуктов будет иметь несколько типов.

Может быть несколькодокумент с разными идентификаторами для одного и того же типа в коллекции типов.И, коллекция продуктов может иметь массив типов с разными идентификаторами того же типа или другого типа.

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

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

{
  "_id": {
    "$numberLong": "1234"
  },
  "name" : "board1",
  "products" : [
     "9876",
     "9875"
   ]
},
{
  "_id": {
    "$numberLong": "1235"
  },
  "name" : "board2"
  "products" : [
     "9876",
     "9875"
   ]
}

В настоящее время я делаю так много звонков, как для каждого типа идентификатора, получить все продукты.

Есть лилюбой другой простой способ с одним запросом, используя $ lookup или любой другой механизм?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

В MongoDB 3.4 вы можете использовать $ lookup , а затем $ addFields , чтобы получить _id из products:

db.types.aggregate([
    {
        "$match": { "type" : "electronic" }
    },
    {
        $lookup: {
            from: "products",
            localField: "_id",
            "foreignField": "types",
            "as": "products"
        }
    },
    {
        $project: {
            field1: 1,
            field2: 1,
            products: {
                $map: {
                    input: "$products",
                    as: "p",
                    in: "$$p._id"
                }
            }
        }
    }
])
0 голосов
/ 04 октября 2018

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

db.types.aggregate([
  { "$match": { "type" : "electronic" }},
  { "$lookup": {
    "from": "testCollection2",
    "let": { "typeId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$$typeId", "$types"] }}}
    ],
    "as": "products"
  }},
  { "$addFields": {
    "products": "$products._id"
  }}
])

Вы можете попробовать агрегацию ниже в mongodb 3.4

db.types.aggregate([
  { "$match": { "type" : "electronic" }},
  { "$lookup": {
    "from": "testCollection2",
    "localField": "_id",
    "foreignField": "types",
    "as": "products"
  }},
  { "$addFields": {
    "products": "$products._id"
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...