簡體   English   中英

MongoDB 從不在其他集合中的集合中獲取文檔

[英]MongoDB get documents from a collection not in other collection

我正在嘗試從不在其他集合中的集合中獲取文檔(SQL 中常見的 NOT IN 子句)。

如果我運行下一個查詢:

db.Companies_Movies.aggregate([
    {
        $project: 
        {
            "CompanyList.Movies.Code" : 1
        }
    },
    {
        $match: 
        {
             "CompanyList.CodeCompany": "23"
        }
    },
    {   
        $lookup:    
        {
            from: "Movies",
            localField: "CompanyList.Movies.Code",
            foreignField: "Movie.Code",
            as: "matched_docs"
        }
    }
]);

此查詢顯示 CompanyList.Movies.Code 和 Movie.Code 中包含的電影。 好的。 但我只有 rest 的電影包含在 CompanyList.Movies 中,其代碼未包含在 Movie.Code 中。

正如 Nikos Tsagkas 在Get "data from collection b not in collection a" in a MongoDB shell 查詢中所說,包含以下句子就足夠了:

    {
        $match: { "matched_docs": { $eq: [] } }
    }

但是當我運行我的最終代碼時,它不會返回任何內容:

    db.Companies_Movies.aggregate([
    {
        $project: 
        {
            "CompanyList.Movies.Code" : 1
        }
    },
    {
        $match: 
        {
            "CompanyList.CodeCompany": "23"
        }
    },
    {
        $lookup:    
        {
            from: "Movies",
            localField: "CompanyList.Movies.Code",
            foreignField: "Movie.Code",
            as: "matched_docs"
        }
    },
    {
        $match: { "matched_docs": { $eq: [] } }
    }
    ]);

此代碼未返回 59 個文檔。


這是我在 Tom 更改后在 MongoDB Compass 中創建的管道,但它仍然無法正常工作:

[{
    $match: 
     {
        'CompanyList.CodeCompany': '23'
     }
     },
     {
          $lookup: 
          {
               from: 'Movies',
               localField: 'CompanyList.Movies.Code',
               foreignField: 'Movie.Code',
               as: 'docs'
          }
     }, 
     {
          $project: 
          {
               'CompanyList.Movies.Code': 1,
               'CompanyList.CodeCompany': 1
          }
     }, 
     {
          $match: 
          {
               docs:{  $eq: [] }
          }
    }]

如果我刪除 $project,它也不起作用。


樣本數據(減少)

公司_電影合集:

{
_id:ObjectId("61bf47b974641866e1244e65"),
"CompanyList": {
    "CodeCompany": "23",
    "NameCompany": "Company Name Entertainment",
    "Movies": [{
        "Code": "123",
        "Name": "Title 1",
        "Order": 1,
        "UserDescription": null
    }, {
        "Code": "124",
        "Name": "Title 2",
        "Order": 2,
        "UserDescription": null
    }, {
        "Code": "125",
        "Name": "Title 3",
        "Order": 3,
        "UserDescription": null
    }],
    "DateInserted": {
        "$date": "2021-12-13T17:30:06.824Z"
    }
  }
}

電影合集:

[{
_id:ObjectId("61bf57bc9d1f93b7ae5fa785"),
"Movie": {
    "Code": "123",
    "OriginalTitle": "Title 1",
    "Year": 2021
 },
_id:ObjectId("61bf57bc9d1f93b7ae5fa786"),
"Movie": {
    "Code": "124",
    "OriginalTitle": "Title 2",
    "Year": 2021
 },
_id:ObjectId("61bf57bc9d1f93b7ae5fa787"),
"Movie": {
    "Code": "125",
    "OriginalTitle": "Title 3",
    "Year": 2021
 },
_id:ObjectId("61bf57bc9d1f93b7ae5fa788"),
"Movie": {
    "Code": "126",
    "OriginalTitle": "Title 4",
    "Year": 2021
 }
}]

有誰知道可能會發生什么?

謝謝大家。

這只是由您的$project階段引起的,在您運行后:

{
  $project: {
    "CompanyList.Movies.Code" : 1
  }
},

您的數據將如下所示:

{
   CompanyList: [
       {
          Movies: { code: "123", ... other fields } 
       }
   ]
}

現在您正在嘗試匹配"CompanyList.CodeCompany": "23" ,但CodeCompany字段根本不存在,因為您沒有在項目階段提供它。

因此,只需更改您的投影階段以包含您將在稍后階段使用的字段:

{
  $project: {
    "CompanyList.Movies.Code" : 1,
    "CompanyList.CodeCompany": 1
  }
},

湯姆。 謝謝你的幫助。

您的解決方案不起作用。

這是我在更改后在 MongoDB Compass 中創建的管道:

[{
    $match: 
     {
        'CompanyList.CodeCompany': '23'
     }
     },
     {
          $lookup: 
          {
               from: 'Movies',
               localField: 'CompanyList.Movies.Code',
               foreignField: 'Movie.Code',
               as: 'docs'
          }
     }, 
     {
          $project: 
          {
               'CompanyList.Movies.Code': 1,
               'CompanyList.CodeCompany': 1
          }
     }, 
     {
          $match: 
          {
               docs:{  $eq: [] }
          }
    }]

如果我刪除 $project,它也不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM