Database 查找MongoDB文档,其中一个字段的值不为null,并且不存在于其他字段中
我试图为同一集合中的不同字段选择一个字段值不存在且不为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”未用
“项目”:{
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的项。谢谢。这似乎是我原则上所需要的。是否可以在搜索中添加另一个字段,例如,与任意值的字符串匹配?