Database 查找MongoDB文档,其中一个字段的值不为null,并且不存在于其他字段中

Database 查找MongoDB文档,其中一个字段的值不为null,并且不存在于其他字段中,database,mongodb,pymongo,Database,Mongodb,Pymongo,我试图为同一集合中的不同字段选择一个字段值不存在且不为null的文档。这是我收藏的文件的简化表示 “项目”:{ id:“abc”, 前一个ID:null }, “项目”:{ id:“def”, 前一个ID:“abc” }, “项目”:{ id:“pqr”, 前一个ID:“def” }, “项目”:{ id:“xyz”, 前一个ID:“pqr” } 我需要查找id为非的记录,该id已被用作以前的id,并且谁的以前的id为非空。在上述情况下,我希望最后一条记录(版本“xyz”)返回为“xyz”未用

我试图为同一集合中的不同字段选择一个字段值不存在且不为null的文档。这是我收藏的文件的简化表示

“项目”:{
id:“abc”,
前一个ID:null
},
“项目”:{
id:“def”,
前一个ID:“abc”
},
“项目”:{
id:“pqr”,
前一个ID:“def”
},
“项目”:{
id:“xyz”,
前一个ID:“pqr”
}
我需要查找id为的记录,该id已被用作以前的id,并且谁的以前的id为空。在上述情况下,我希望最后一条记录(版本“xyz”)返回为“xyz”未用作以前的ID。自我参照的东西给我带来了麻烦

在伪代码中,它将是:

select item where id does not exist as previousid and previousid is not null
我对MongoDB比较陌生(但不熟悉数据库)。我花了好几个小时仔细研究这些文档,并尝试了许多方法,如
$ne
$nin
$和
以及
$expr
,但是我显然遗漏了一些内容。

您可以使用检查指定集合中是否存在该字段,并针对
priviousId

db.collection.aggregate([
  { "$graphLookup": {
    "from": "collection",
    "startWith": "$id",
    "connectFromField": "id",
    "connectToField": "previousid",
    "as": "data"
  }},
  { "$match": { "data": [] }}
])

以下是您收集的数据

[
  {
    "item": {
      id: "abc",
      previousid: null
    }
  },
  {
    "item": {
      id: "def",
      previousid: "abc"
    }
  },
  {
    "item": {
      id: "pqr",
      previousid: "pqr"
    }
  },
  {
    "item": {
      id: "xyz",
      previousid: "pqr"
    }
  }
]
您可以在一个查询中获得结果,如下所示:

collectionName.find({
  "item.previousid": {
    $ne: null
  },
  $expr: {
    $ne: [
      "$item.id",
      "$item.previousid"
    ]
  }
})
给你结果:

[
  {
    "item": {
      "id": "def",
      "previousid": "abc"
    }
  },
  {
    "item": {
      "id": "xyz",
      "previousid": "pqr"
    }
  }
]

恐怕这还提供了两项。我需要返回带有“xyz”的单个记录,因为它是唯一一个id未用作以前id的项。谢谢。这似乎是我原则上所需要的。是否可以在搜索中添加另一个字段,例如,与任意值的字符串匹配?