【问题标题】:Manipulating data and join mongodb操作数据并加入 mongodb
【发布时间】:2021-03-15 17:42:35
【问题描述】:

我对Mongodb比较陌生,需要做到以下几点:

我有 2 个表,“记录”和“文件”。

“记录”表中的一行如下所示: { "_id" : ObjectId("6012d31aea8fb06d8bf438a0"), "img" : false, "type" : "DRAFT", "submitted" : true }

“文件”表中的一行如下所示: { "_id" : ObjectId("5fabf23f917863623ec54a86"), "filename" : "6012d31aea8fb06d8bf438a0", "uploadDate" : ISODate("2020-11-11T14:16:31.462Z"), "length" : NumberLong(4119) }

“files”表中的“filename”字段对应“records”表中的_id字段。

如何在“记录”表中找到文件名不是 id 的所有“文件”?

谢谢!

编辑:* 我使用的是 Mongo 3.6 版*

【问题讨论】:

  • 您好,您似乎没有任何选择。您需要最低 MongoDB 版本 4.0 来实现您想要的。在这里查看:stackoverflow.com/questions/53953664/…
  • 很遗憾,我没有那个选项...我受到工作中使用的版本的限制...

标签: mongodb join mongodb-query subquery


【解决方案1】:
  1. filename 转换为ObjectId
  2. 使用filename_id 执行$lookup(或加入)操作。
  3. 保留空的records(这意味着records 集合没有该文件的条目)。

试试这个查询:

db.files.aggregate([
    {
        $lookup: {
            from: "records",
            let: { file_id: { $toObjectId: "$filename" } },
            pipeline: [
                {
                    $match: {
                        $expr: { $eq: ["$_id", "$$file_id"] }
                    }
                }
            ],
            as: "records"
        }
    },
    {
        $match: {
            $expr: {
                $eq: [{ $size: "$records" }, 0]
            }
        }
    }
])

【讨论】:

  • 嗨,感谢您的及时回答,但这似乎不起作用。我收到此错误 E QUERY [js] SyntaxError: missing ] after element list @(shell):1:195
  • 你在哪里得到这个错误?在 Node.js(Express.js) 或终端或您使用的数据库工具中?
  • 我在终端中运行它。我尝试在一个文件中运行它并得到“一个管道阶段规范对象必须包含一个字段。”,
  • MongoDB shell 版本 v3.6.13
【解决方案2】:

Mongo 3.6 版本:

我创建了一个集合“temp”(稍后我将删除它以节省空间):

db.createCollection("temp");

    db.records.find().map( function(u) { 
    db.temp.insert({'strId': u._id.str, 'type': u.type, 'status': u.submitted, 'image': u.img});
});

然后使用与@Dheemanth Bhat 的回答类似的聚合对其进行查询:

db.temp.aggregate([
    {
        $lookup: {
            from: "files",
            let: { testId:  "$strId"  },
            pipeline: [
                {
                    $match: {
                        $expr: { $eq: ["$$testId", "$filename"] }
                    }
                }
            ],
            as: "corresponding_id"
        }
    },
    {
        $match: {
            $expr: {
                $eq: [{ $size: "$corresponding_id" }, 0]
            }
        }
    }
])

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多