Запрос поиска Mongodb для коллекций с ObjectId как локальные и внешние поля? - PullRequest
0 голосов
/ 31 января 2020

У меня есть две коллекции, для которых мне нужно сделать запрос поиска по ObjectId обеих коллекций . Как локальные, так и внешние поля имеют тип ObjectId. Я могу преобразовать один ObjectId коллекции в строку с помощью метода $ toString, но как мне сделать то же самое с другой коллекцией, к которой я хочу присоединиться?

Json 1:

{
    "_id": {
        "$oid": "4efcggedwrg446"
    },
    "name": "Name1",
    "phone": "12345678"
}

Json 2:

{
  "_id": {
    "$oid": "4efcggedwrg446"
  },
  "deviceId": "6552gggh732",
  "deviceName": "samsung"
}

Запрос:

[{$addFields: {
  "Id": { "$toString": "$_id" }
}}, {$lookup: {
  from: 'json2',
  localField: 'Id',
  foreignField: '_id',
  as: 'join'
}}]

Запрос поиска для _id обоих json. Как я могу конвертировать ObjectId другой коллекции?

1 Ответ

0 голосов
/ 31 января 2020

Коллекция1

{
    "_id" : ObjectId("5e33bfc008591b180967753a"),
    "name" : "Name1",
    "phone" : "12345678"
}

Коллекция2

{
    "_id" : ObjectId("5e33bfe508591b180967753b"),
    "iUserId" : ObjectId("5e33bfc008591b180967753a"),
    "deviceId" : "6552gggh732",
    "deviceName" : "samsung"
},

Объединить оба с lookup

const query = [
    {
        $lookup:
            {
                from: "Collection2",
                localField: "_id",
                foreignField: "iUserId",
                as: "User"
            }
    },
    {
        $unwind: "$User"
    }
];

db.Collection1.aggregate(query)

Результат: - Вы можете применить $project, чтобы получить указанные c поля

{
    "_id" : ObjectId("5e33bfc008591b180967753a"),
    "name" : "Name1",
    "phone" : "12345678",
    "User" : {
        "_id" : ObjectId("5e33bfe508591b180967753b"),
        "iUserId" : ObjectId("5e33bfc008591b180967753a"),
        "deviceId" : "6552gggh732",
        "deviceName" : "samsung"
    }
}
...