我是mongodb的新手,目前我正面临这个问题,
db.medical_records.aggregate([
{
"$group": {
"_id": {
"disease_id": "$disease_id" //a string
}, "count": { "$sum": 1 }
}
},
{
"$addFields": {
"disease_id": { "$toObjectId": "$disease_id" }
// i tried to change it into objectID so i could $lookup it
}
},
{
"$lookup": {
"from": "diseases",
"localField": "disease_id",
"foreignField": "_id",
"as": "disease"
}
}
])
这是我的病历集的一个例子
{
"_id" : ObjectId("5989c8f13f3958120800682e"),
"disease_id" : "5989c8f13f3958120800682f",
"patient_id" : "5989c8f13f3958120800681f"
}
疾病收集
{
"_id" : ObjectId("5989c8f13f3958120800682f"),
"name" : "Culpa autem officia.",
"code" : "Est aperiam."
}
,我期望的结果很好,
{
"_id" : {disease_id: 5989c8f13f3958120800682f},
"count" : 20,
"disease" : {
"_id" : ObjectId("5989c8f13f3958120800682f"),
"name" : "Culpa autem officia.",
"code" : "Est aperiam."
}
}
如上所述,我需要将我的病历收集加入到疾病收集中。
当我尝试将其查找到疾病集合时,它失败了,因为foreignField与localField的类型不同。我一直在努力寻找解决这个问题的方法。上面的查询返回了另一个错误,
Unrecognized expression '$toObjectId'
可能已多次询问此问题,但我确实需要解决此问题,请帮助
答案 0 :(得分:1)
目前的数据结构无法做到这一点。
另见:Mongoose $lookup where localField is a string of an ObjectId in foreignField
在这里:Is it possible to compare string with ObjectId via $lookup
但是,为什么不将医疗记录集中的数据更改为:
{
"_id" : ObjectId("5989c8f13f3958120800682e"),
"disease_id" : ObjectId("5989c8f13f3958120800682f"), // note the ObjectId
"patient_id" : ObjectId("5989c8f13f3958120800681f") // note the ObjectId
}
鉴于此格式,您可以使用以下查询获得所需内容:
db.medical_records.aggregate([
{
"$group": {
"_id": {
"disease_id": "$disease_id" //a string
}, "count": { "$sum": 1 }
}
},
{
"$lookup": {
"from": "diseases",
"localField": "_id.disease_id",
"foreignField": "_id",
"as": "disease"
}
}
])
根据您的评论编辑:
MongoDB中没有$toObjectId
运算符。试试searching the documentation,您什么也找不到!因此,如果不更改数据,就无法实现目标。我不知道"雄辩的laravel-mongodb"您提到的框架,但根据其文档,我认为您的模型可能需要一些调整。你现在如何建立你的关系模型?
答案 1 :(得分:1)
4.0的新功能:https://docs.mongodb.com/manual/reference/operator/aggregation/toObjectId/
// Define stage to add convertedId field with converted _id value
idConversionStage = {
$addFields: {
convertedId: { $toObjectId: "$_id" }
}
};
// Define stage to sort documents by the converted qty values
sortStage = {
$sort: { "convertedId": -1 }
};
db.orders.aggregate( [
idConversionStage,
sortStage
])
答案 2 :(得分:0)
怎么...查看所有文档和stackoverflow答案之后,我将建议一个简单的修复程序。
在另一个集合中保存users_id或任何文档对象ID时,请确保dataType保持ObjectId或将其强制转换为ObjectId,然后再保存文档。
然后仅在Mongodb上使用文档,而无需尝试强制转换或绑定。
db.orders.aggregate([
{
$lookup:
{
from: "users",
localField: "user_id",
foreignField: "_id",
as: "inventory_docs"
}
}
])
This case user_id is coming from your current model then _id is coming from your users collections which both are already ObjectId by Origin.
答案 3 :(得分:0)
例如,将引用保存到新集合时。订单集合中的user_id。确保dataType是ObjectID。那么您可以使用ObjectID而不必进行转换。例如车辆和驾驶员集合。默认情况下,聚合会将dataType与dataType匹配,这也可以保持查询的速度。
const Foo &