需要一种解决方法来查找objectID foreignField的字符串

时间:2017-08-08 16:13:14

标签: mongodb

我是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'

可能已多次询问此问题,但我确实需要解决此问题,请帮助

4 个答案:

答案 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 &