MongoDB - mongofiles

时间:2014-04-01 22:15:12

标签: mongodb gridfs

C:\Programs\MongoDB\bin>mongofiles.exe list
connected to: 127.0.0.1
test123.txt     6
test123.txt     22
test123.txt     44
test456.txt     53
test456.txt     53
test456.txt     53
test456.txt     53
test456.txt     53
test456.txt     15

C:\Programs\MongoDB\bin>

当我mongofiles get test456.txt时,我总是得到最后一个 我在GridFS中使用该名称放入的文件。我怎么得到 其他/以前的提供他们都有重复的名称?

根据我需要指明的文件:

"一个文件名,它是:WB上文件的名称 您的本地文件系统或GridFS对象。"

http://docs.mongodb.org/manual/reference/program/mongofiles/

但是我并不清楚什么"一个GridFS对象"在这种情况下意味着。

3 个答案:

答案 0 :(得分:5)

" GridFS对象"在此上下文中表示存储在GridFS集合中的对象的名称。可以通过mongofiles手册页上的--local选项最好地解释这种区别。

您需要考虑的是,您所做的是使用"相同的"提交项目。使用mongofiles实用程序的文件名。如该实用程序的手册页中所述,put(请参阅commands)选项的默认行为是在商店中创建新条目。这可以使用--replace选项覆盖,以便找到任何现有内容并使用您创建的新内容覆盖。

简而言之,无论文件是否包含不同的内容,您都创建了几个具有相同"对象名称"的东西。就mongofiles实用程序而言,它只知道如何通过"对象名称来获取"对象名称"所以它只会根据它的规则检索它找到的第一个。

现在,在GridFS的大多数API实现中,实际的get操作通常由_id完成。每个"对象"你以这种方式创建它仍然拥有它自己唯一的_id值,所以当应用它时,你可以获得"对象"你想要的。

某些API实现添加了额外的查询类型方法,以便通过" filename"或其他元数据信息。但大多数情况下他们并不打扰,因为这些实际上只是对包含内容元数据和引用(默认为fs.files)的任何集合的标准.find().findOne()操作。这提供了超过合理数量的方法来找到"通过该API的_id接口get值的特定对象和问题。

因此虽然mongofiles是一个很好的实用工具,可以从命令行执行基本的CRUD类型操作,但它只是一个实用程序,而不是"如何执行它的主要实现"。因此,作为一种实用工具,它提供了一种便利性。设置和获取对象的形式,使用"文件名"对象标识符的一部分。

另外值得注意的是,你 应该像文件系统一样对待GridFS商店,并保留你的文件名"与文件系统中所需的一样唯一。

但至于mongofiles实用程序," name"你只需要继续检索信息。尽量不这样做,或者真正使用您选择的语言API来完成工作。

答案 1 :(得分:3)

我知道这个问题已经很老了,但人们可能仍然会来这里寻找答案,所以我想加上我的 2 美分。

这可能是更新版本的 mongofiles 中的一个新功能,但现在您可以让 mongofiles 实用程序也使用对象 ID,因此不再只是文件名。为此,您可以例如使用以下命令:

mongofiles get_id 'ObjectId("xyz...")'

其中 xyz... 是 mongo DB 对象 ID 字符串。

现在不幸的是,我看不到可以使用 mongofiles 显示数据库中文件的对象 ID 的方法,因此,为此,您需要使用普通的 mongo 命令行界面(mongo)使用诸如

之类的命令
db.getCollection("fs.files").find({filename:/abc/i})

其中 abc 是文件名。输出看起来类似于

{ "_id" : ObjectId("xyz..."), "chunkSize" : 261120, "uploadDate" : ISODate("2018-12-09T13:37:43.743Z"), "length" : 16904, "md5" : "08ea...", "filename" : "abc" }

如果有多个名为 abc 的文件,则结果中会有多个项目。从这里您可以获取对象 id 字符串,然后使用它来调用 mongofiles get_id 命令...

答案 2 :(得分:0)

@Neil Lunn的回答是正确的。

以下是我的例子:

-d表示您的数据库,

-l表示您要上传的文件的本地文件系统路径

put表示您要上传文件

CDBG_2015_1.pdf表示GridFS中的文件名(不是您的本地文件系统路径)

 mongofiles -d civilpdf -l  C:\jh1\share_map_online\desktop_map_export\pdf\CDBG_2015_1.pdf put CDBG_2015_1.pdf

然后你可以按关键字" CDBG"

搜索文件
mongofiles -d civilpdf search CDBG

您可以将文件下载到您喜欢的任何地方

mongofiles -d civilpdf -l "C:\your liked whatever place"  get CDBG_2015_1.pdf