相关疑难解决方法(0)

Mongodb从String到ObjectId加入_id字段

我有两个系列

  1. 用户

             {
                 "_id" : ObjectId("584aac38686860d502929b8b"),
                 "name" : "John"
             }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 角色

     {
         "_id" : ObjectId("584aaca6686860d502929b8d"),
         "role" : "Admin",
         "userId" : "584aac38686860d502929b8b"  
     }
    
    Run Code Online (Sandbox Code Playgroud)

我想基于userId(在角色集合中) - _id(在用户集合中)加入这些集合.

我尝试了以下查询:

db.role.aggregate(
{
   $lookup:
   {
       from: 'user',
       localField: 'userId',
       foreignField: '_id',
       as: 'output'
   }
}
);
Run Code Online (Sandbox Code Playgroud)

只要我将userId存储为ObjectId,这就给了我预期的结果.当我的userId是一个字符串时,没有结果.Ps:我试过了

foreignField:'_ id'.valueOf()

和

foreignField:'_ id'.toString()

.但是基于ObjectId-string字段匹配/加入没有运气.

任何帮助将不胜感激.

lookup join mongodb aggregation-framework objectid

17
推荐指数
3
解决办法
2万
查看次数

将$ graphLookup的ObjectId与String匹配

我正在尝试运行$graphLookup类似以下所示的示例:

$ graphLookup示例

目的是在给定特定记录($match在此处有注释)的情况下,通过immediateAncestors属性检索其完整的“路径” 。如您所见,这没有发生。

我$convert在这里介绍了_idfrom的处理方式,因为string相信可以与_idfrom immediateAncestors记录列表(是string)“匹配” 。

因此,我确实使用不同的数据运行了另一个测试(不ObjectId涉及):

db.nodos.insert({"id":5,"name":"cinco","children":[{"id":4}]})
db.nodos.insert({"id":4,"name":"quatro","ancestors":[{"id":5}],"children":[{"id":3}]})
db.nodos.insert({"id":6,"name":"seis","children":[{"id":3}]})
db.nodos.insert({"id":1,"name":"um","children":[{"id":2}]})
db.nodos.insert({"id":2,"name":"dois","ancestors":[{"id":1}],"children":[{"id":3}]})
db.nodos.insert({"id":3,"name":"três","ancestors":[{"id":2},{"id":4},{"id":6}]})
db.nodos.insert({"id":7,"name":"sete","children":[{"id":5}]})
Run Code Online (Sandbox Code Playgroud)

和查询:

db.nodos.aggregate( [
  { $match: { "id": 3 } },
  { $graphLookup: {
      from: "nodos",
      startWith: "$ancestors.id",
      connectFromField: "ancestors.id",
      connectToField: "id",
      as: "ANCESTORS_FROM_BEGINNING"
    }
  },
  { $project: {
      "name": 1,
      "id": 1,
      "ANCESTORS_FROM_BEGINNING": "$ANCESTORS_FROM_BEGINNING.id"
    }
  }
] )
Run Code Online (Sandbox Code Playgroud)

...输出了我期望的结果(这5条记录直接或间接与id3 条记录相关):

{
    "_id" : ObjectId("5afe270fb4719112b613f1b4"),
    "id" …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

2
推荐指数
1
解决办法
1436
查看次数