ChatGPT解决这个技术问题 Extra ChatGPT

如何在 mongo 控制台中通过 ObjectId 搜索对象?

我发现这个问题是针对 C# 和 Perl 回答的,但不是在本机界面中。我认为这会起作用:

db.theColl.find( { _id: ObjectId("4ecbe7f9e8c1c9092c000027") } )

查询未返回任何结果。我通过执行 db.theColl.find() 并获取 ObjectId 找到了 4ecbe7f9e8c1c9092c000027。该集合中有数千个对象。

我已经阅读了在 mongodb.org 网站上可以找到的所有页面,但没有找到。这只是一件奇怪的事情吗?这对我来说似乎很正常。


T
Tyler Brock

一点也不奇怪,人们总是这样做。确保集合名称正确(大小写很重要)并且 ObjectId 准确无误。

文档是 here

> db.test.insert({x: 1})

> db.test.find()                                               // no criteria
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }      

> db.test.find({"_id" : ObjectId("4ecc05e55dd98a436ddcc47c")}) // explicit
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }

> db.test.find(ObjectId("4ecc05e55dd98a436ddcc47c"))           // shortcut
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }

奇怪,我重新启动了我的控制台,它突然工作了。有什么方法可以改变你的“范围”或命令行上的东西,而不是真的知道吗?
难怪:当我搜索“查找 ObjectID”时,该页面没有出现:mongodb.org/…
是的,您可能不小心输入了“use dbname”并切换了数据库。我假设您没有使用复制或分片,这显然会为它没有出现的原因创造其他可能性。
问题是我没有在我的_id 周围加上引号。
哇,我不知道这在 MongoDB 中有什么特别之处,浪费了一些时间,以为我的问题出在其他地方,但发现它只需要额外的规则。对于使用 express 和 node 的人的价值,需要 require ObjectId exp... var ObjectId = require('mongodb').ObjectID;
P
Phil

如果您使用的是 Node.js:

var ObjectId = require('mongodb').ObjectId; 
var id = req.params.gonderi_id;       
var o_id = new ObjectId(id);
db.test.find({_id:o_id})

编辑:更正为新的 ObjectId(id),而不是新的 ObjectID(id)


import { ObjectId } from "mongodb"; 适用于更高级的 JS。
我根本不使用 Node.js。我不明白第二行:(有什么想法吗?
第二行是附加到请求参数gonderi_id 的“_id”字段值。
与 findOne 命令一起使用以获得更漂亮的输出。
R
Robert

更容易,尤其是使用制表符完成:

db.test.find(ObjectId('4ecc05e55dd98a436ddcc47c'))

编辑:也适用于 findOne 命令以获得更漂亮的输出。


如果我们想使用多个对象 ID 进行搜索,就像我们在 mysql 中实现 WHERE IN 条件的方式一样。
这给了我一个错误:TypeError: filter must be an instance of dict, bson.son.SON, or other type that inherits from collections.Mapping
@DavidOkwii - 此示例适用于 MongoShell。看起来您是从 Python 运行的,在这种情况下,您需要执行以下操作:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
这是错误的,即使 ObjectId 与指定的 ID 不匹配,在 db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868')) 命令中使用这种方法也会删除文档。您需要像这样精确指定 db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
这个问题是关于 find(),而不是关于 findOneAndDelete()
M
Mohamed Abdullah J

您错过了插入双引号。确切的查询是

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )

“问题是我没有在我的 _id 周围加上引号。” -- 2011 年 12 月 7 日,见第一个答案的评论
@jcollum 作为更新,您现在提出的查询将有效,而_id 周围没有引号。
w
whoami - fakeFaceTrueSoul

如果您正在使用 mongo shell,请参考:Answer from Tyler Brock

如果您使用 node.js 使用 mongodb,我写了答案

您无需将 id 转换为 ObjectId。只需使用:

db.collection.findById('4ecbe7f9e8c1c9092c000027');

此收集方法会自动将 id 转换为 ObjectId。

另一方面 :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'}) 未按预期工作。您已手动将 id 转换为 ObjectId

可以这样做:

let id = '58c85d1b7932a14c7a0a320d';

let o_id = new ObjectId(id);   // id as a string is passed

db.collection.findOne({"_id":o_id});

findById 应该是来自 mongoose 的函数/方法 - 它在内部将字符串转换为 ObjectId,除非您使用 mongoose,否则无论是节点还是其他代码,此代码都对您没有帮助......!!
是的..我忘了提到猫鼬是必需的......谢谢你的纠正
P
Pang

我认为你最好写这样的东西:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})

你能解释一下这段代码是如何回答这个问题的吗?
O
Oliver Wolf

打开 mongo CLI 后,在正确的数据库上连接并授权。

以下示例显示了如何从名为“products”的集合中查找具有 _id=568c28fffc4be30d44d0398e 的文档:

db.products.find({"_id": ObjectId("568c28fffc4be30d44d0398e")})

P
Patrick Graham

我刚刚遇到了这个问题,并且完全按照记录的方式进行操作,但仍然无法正常工作。

查看您的错误消息并确保您没有复制任何特殊字符。我收到错误消息

SyntaxError: illegal character @(shell):1:43

当我转到字符 43 时,它只是我的对象 ID 的开始,在开放引号之后,就像我粘贴它一样。我把光标放在那里并按退格键,当它应该删除开放引号时似乎没有发生任何事情。我再次按下退格键,它删除了打开的报价,然后我把报价放回去并执行了查询,它工作了,尽管看起来完全一样。

我在 WebMatrix 中进行开发并从控制台复制了对象 ID。每当您从 WebMatrix 中的控制台复制时,您可能会选择一些会导致错误的不可见字符。


K
Kushal Bhalaik

在 MongoDB Stitch 函数中,可以使用 BSON 完成,如下所示:

为此,请使用 BSON 实用程序包中的 ObjectId 帮助程序,如下例所示:

var id = "5bb9e9f84186b222c8901149";  
BSON.ObjectId(id);

M
Miguel Peguero

要使用 Objectid 方法,您不需要导入它。它已经在 mongodb 对象上。

var ObjectId = new db.ObjectId('58c85d1b7932a14c7a0a320d'); db.yourCollection.findOne({ _id: ObjectId }, function (err, info) { console.log(info) });


没有:TypeError: db.ObjectId is not a function
只是ObjectId("SOMETHING")
U
Undo

只需这样做:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');

Mongo Shell 版本 3.2.7 开始,这对我不起作用。
那只会匹配一个 _id ,它是一个字符串;如果是真正的 ObjectId,则需要使用 ObjectId 语法进行搜索。