通过匹配多个条件将引用添加到另一个 mongodb 集合
Adding refs to another mongodb collection by matching multiple criteria
我是 MongoDB 的新手,无法从文档中解决这个问题。我有两个集合,TREES
和 PLOTS
。每棵树都在一块地里;例如,每个地块都有 4-150 棵树。到目前为止,集合看起来像这样:
// TREES
[{"_id": objId(), "Tree": "1", "Project": "Alpha", "Plot": "A", "Year": 1979, "Size": 20},
{"_id": objId(), "Tree": "1", "Project": "Alpha", "Plot": "A", "Year": 1986, "Size": 21},
...
{"_id": objId(), "Tree": "54", "Project": "Omega", "Plot": "Z", "Year": 2016, "Size": 17}]
// PLOTS
[{"_id": objId(), "Plot": "A", "Project": "Alpha", "Year": 1979},
{"_id": objId(), "Plot": "A", "Project": "Alpha", "Year": 1986},
...
{"_id": objId(), "Plot": "Z", "Project": "Omega", "Year": 2016}]
我想为所有树添加一个引用字段,该字段具有适当绘图文档的 objId,匹配项目、绘图和年份。我还想向所有 Plots 添加一个 refs 数组,以包含每个树的 objIds [编辑:虽然也许这真的没有必要?]。真正的模式都有 30-40 个字段,所以嵌入会很疯狂。应用程序开发很可能是在 pymongo 中完成的,如果那里有任何相关的话。
澄清:
我的问题是根据三个标准将树与地块匹配——似乎 $lookup
在这里没有用,我试过 $unionWith
但无法弄清楚。文档和教程充满了玩具问题,您可以通过在 one 字段上匹配来添加集合间引用……我不知道如何概括它。最好的结果来自
db.TREES.aggregate([
{
'$lookup': {
'from': 'PLOTS',
'localField': 'Plot',
'foreignField': 'Plot',
'as': 'TooManyPlots'
}
}
])
这为我提供了所有具有正确名称的图的数组——但来自所有年份和所有项目,我无法弄清楚如何将其剔除并仅包含一个更新的树文档正确的情节。
我还没有开发 Mongo-vision 来查看正确的流程。
可能是我也遇到了一些 XY 问题——另外可能是 MongoDB 无论如何都不是我们项目的最佳选择。不过似乎值得一试。
好的——除了理解如何理解它之外,它没有什么大的奥秘。希望能帮到别人这里是我如何让它工作的,与评论中提到的 doc reference @D.SM 非常匹配,我要感谢他们。
db.TREES.aggregate(
[{$lookup: {
from: 'Plots',
let: { tPlot: '$Plot', tProj: '$Project', tYear: '$Year'},
pipeline: [
{ $match:
{ $expr:
{ $and:
[{$eq: ['$Plot', '$$tPlot']},
{$eq: ['$Project', '$$tProj']},
{$eq: ['$Year', '$$tYear']}]
}
}
},
{ $project: { _id:1} }
],
as: 'Plot_id_A'
} // That does what I wanted; from here it's just tidying things up
}, {$unwind: {
path: '$Plot_id_A',
}}, {$set: {
Plot_id: '$Plot_id_A._id'
}}, {$project: {
Plot_id_A : 0
}}]
请注意,在 let:
行中,right-hand 名称均来自我们正在使用的 TREES
集合,而在 $and:
行中,same-named left-hand 名称都来自我们正在加入的 PLOTS
集合,因此为了清楚起见,我承认 D.SM 对我的示例字段名称的不满。无论如何它都有效。
如果有人有改进建议...让我知道!
我是 MongoDB 的新手,无法从文档中解决这个问题。我有两个集合,TREES
和 PLOTS
。每棵树都在一块地里;例如,每个地块都有 4-150 棵树。到目前为止,集合看起来像这样:
// TREES
[{"_id": objId(), "Tree": "1", "Project": "Alpha", "Plot": "A", "Year": 1979, "Size": 20},
{"_id": objId(), "Tree": "1", "Project": "Alpha", "Plot": "A", "Year": 1986, "Size": 21},
...
{"_id": objId(), "Tree": "54", "Project": "Omega", "Plot": "Z", "Year": 2016, "Size": 17}]
// PLOTS
[{"_id": objId(), "Plot": "A", "Project": "Alpha", "Year": 1979},
{"_id": objId(), "Plot": "A", "Project": "Alpha", "Year": 1986},
...
{"_id": objId(), "Plot": "Z", "Project": "Omega", "Year": 2016}]
我想为所有树添加一个引用字段,该字段具有适当绘图文档的 objId,匹配项目、绘图和年份。我还想向所有 Plots 添加一个 refs 数组,以包含每个树的 objIds [编辑:虽然也许这真的没有必要?]。真正的模式都有 30-40 个字段,所以嵌入会很疯狂。应用程序开发很可能是在 pymongo 中完成的,如果那里有任何相关的话。
澄清:
我的问题是根据三个标准将树与地块匹配——似乎 $lookup
在这里没有用,我试过 $unionWith
但无法弄清楚。文档和教程充满了玩具问题,您可以通过在 one 字段上匹配来添加集合间引用……我不知道如何概括它。最好的结果来自
db.TREES.aggregate([
{
'$lookup': {
'from': 'PLOTS',
'localField': 'Plot',
'foreignField': 'Plot',
'as': 'TooManyPlots'
}
}
])
这为我提供了所有具有正确名称的图的数组——但来自所有年份和所有项目,我无法弄清楚如何将其剔除并仅包含一个更新的树文档正确的情节。
我还没有开发 Mongo-vision 来查看正确的流程。 可能是我也遇到了一些 XY 问题——另外可能是 MongoDB 无论如何都不是我们项目的最佳选择。不过似乎值得一试。
好的——除了理解如何理解它之外,它没有什么大的奥秘。希望能帮到别人这里是我如何让它工作的,与评论中提到的 doc reference @D.SM 非常匹配,我要感谢他们。
db.TREES.aggregate(
[{$lookup: {
from: 'Plots',
let: { tPlot: '$Plot', tProj: '$Project', tYear: '$Year'},
pipeline: [
{ $match:
{ $expr:
{ $and:
[{$eq: ['$Plot', '$$tPlot']},
{$eq: ['$Project', '$$tProj']},
{$eq: ['$Year', '$$tYear']}]
}
}
},
{ $project: { _id:1} }
],
as: 'Plot_id_A'
} // That does what I wanted; from here it's just tidying things up
}, {$unwind: {
path: '$Plot_id_A',
}}, {$set: {
Plot_id: '$Plot_id_A._id'
}}, {$project: {
Plot_id_A : 0
}}]
请注意,在 let:
行中,right-hand 名称均来自我们正在使用的 TREES
集合,而在 $and:
行中,same-named left-hand 名称都来自我们正在加入的 PLOTS
集合,因此为了清楚起见,我承认 D.SM 对我的示例字段名称的不满。无论如何它都有效。
如果有人有改进建议...让我知道!