社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

仅当MongoDB中的外部字段不为空时查找

Michal • 5 年前 • 1556 次点击  

我收藏了一些文章和评论。评论可能有 articleId (这是对文章的答复)或 parentId (这是对另一条评论的回应)。只有两个层次,回答另一个评论不能有答案。

// articles
{ "_id": 100, "text": "Article text" } 

// comments
{ "_id": 1, "text": "First text", "articleId": 100 },
{ "_id": 2: "text": "Second text", "articleId": 100 },
{ "_id": 3, "text": "Third text", "parentId": 2 }  

我想找到所有 文章 , 评论 物品和 答案 评论。

db.getCollection("articles").aggregate([
    { "$match": {} },

    // Lookup comments of article.
    { "$lookup": { "from": "comments", "localField": "_id", "foreignField": "parentId", as: "comments" } },
    { "$unwind": { "path": "$comments", "preserveNullAndEmptyArrays": true } },

    // Lookup answers to comments. There I need lookup only when foreignField is not null.
    { "$lookup": { "from": "comments", "localField": "comments._id", "foreignField": "parentId", "as": "comments.answers" } },
    { "$group": { "_id": "$_id", "comments": { "$push": "$comments" }, "text": { "first": "$text" } }
])

如果这篇文章有一些评论,它就会起作用。但如果不是,在第一次 lookup (文章注释)文章如下(空数组可以):

{ "_id": 100, "text": "Article text", "comments": [] }

在第二秒之后 查找 (回复评论):

{
    "_id": 100,
    "text": "Article text",
    "comments": [{
        "answers": [
            { "_id": 1, "text": "First text", "articleId": 100 },
            { "_id": 2: "text": "Second text", "articleId": 100 }
        ]
    }]
}

即使没有评论,评论也有一些答案。我想是因为localfield comments._id null 和外域 帕伦特 这些答案中也有 无效的 . 只有当foreignfield是 not null ?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43951
 
1556 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Ashh
Reply   •   1 楼
Ashh    6 年前

可以使用下面的聚合与MangoDB 三点六 及以上

Article.aggregate([
  { "$lookup": {
    "from": "comments",
    "let": { "articleId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$articleId", "$$articleId" ] } } },
      { "$lookup": {
        "from": "comments",
        "let": { "commentId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$parentId", "$$commentId" ] } } }
        ],
        "as": "answers"
      }}
    ],
    "as": "comments"
  }}
])