如何在 mongo 控制台中通过 ObjectId 搜索对象?
Posted
技术标签:
【中文标题】如何在 mongo 控制台中通过 ObjectId 搜索对象?【英文标题】:How do I search for an object by its ObjectId in the mongo console? 【发布时间】:2012-01-04 04:52:59 【问题描述】:我发现这个问题是针对 C# 和 Perl 回答的,但不是在本机界面中。我认为这会起作用:
db.theColl.find( _id: ObjectId("4ecbe7f9e8c1c9092c000027") )
查询未返回任何结果。我通过执行db.theColl.find()
并获取一个ObjectId 找到了4ecbe7f9e8c1c9092c000027。该集合中有数千个对象。
我已经阅读了 mongodb.org 网站上可以找到的所有页面,但没有找到。这只是一件奇怪的事情吗?这对我来说似乎很正常。
【问题讨论】:
【参考方案1】:如果您使用的是 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”字段值。【参考方案2】:
如果您使用的是 Node.js:
在那个 req.user 是 ObjectId 格式。
var mongoose = require("mongoose");
var ObjectId = mongoose.Schema.Types.ObjectId;
function getUsers(req, res)
User.findOne("_id":req.user, password: 0 )
.then(data =>
res.send(data);)g
exports.getUsers = getUsers;
【讨论】:
【参考方案3】:如果您正在使用 mongo shell,请参考:Answer from Tyler Brock
如果您使用 mongodb 使用 node.js,我写了答案
您无需将 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,否则无论是节点还是其他代码,此代码都无济于事..!! 是的..我忘了说猫鼬是必需的.....谢谢你的纠正【参考方案4】:在 MongoDB Stitch 函数中,可以使用 BSON 来完成,如下所示:
使用 BSON 实用程序包中的 ObjectId
帮助器来实现此目的,如下例所示:
var id = "5bb9e9f84186b222c8901149";
BSON.ObjectId(id);
【讨论】:
【参考方案5】:我认为你最好这样写:
db.getCollection('Blog').find("_id":ObjectId("58f6724e97990e9de4f17c23"))
【讨论】:
你能解释一下这段代码是如何回答这个问题的吗?【参考方案6】:要使用 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")
【参考方案7】:
打开 mongo CLI 后,在正确的数据库上连接和授权。
以下示例显示如何使用名为“products”的集合中的 _id=568c28fffc4be30d44d0398e 来 find the document:
db.products.find("_id": ObjectId("568c28fffc4be30d44d0398e"))
【讨论】:
【参考方案8】:我刚刚遇到了这个问题,并且完全按照记录的方式进行操作,但仍然无法正常工作。
查看您的错误消息并确保您没有复制任何特殊字符。我收到了错误
SyntaxError: illegal character @(shell):1:43
当我转到字符 43 时,它只是我的对象 ID 的开始,在开放引号之后,就像我粘贴它一样。我把光标放在那里并按退格键,当它应该删除开放引号时似乎没有发生任何事情引用。我再次按退格键,它删除了打开的引号,然后我把引号放回原处并执行了查询,它工作了,尽管看起来完全一样。
我在 WebMatrix 中进行开发并从控制台复制了对象 ID。每当您从 WebMatrix 中的控制台复制时,您可能会拾取一些会导致错误的不可见字符。
【讨论】:
【参考方案9】:一点也不奇怪,人们总是这样做。确保集合名称正确(大小写很重要)并且 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;【参考方案10】:简单地做:
db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');
【讨论】:
从Mongo Shell
3.2.7 版开始,这对我不起作用。
那只会匹配一个 _id 这是一个字符串;如果是真正的 ObjectId,则需要使用 ObjectId 语法进行搜索。【参考方案11】:
您错过了插入双引号。 确切的查询是
db.theColl.find( "_id": ObjectId("4ecbe7f9e8c1c9092c000027") )
【讨论】:
“问题是我没有在我的 _id 周围加上引号。” -- 2011 年 12 月 7 日,请参阅第一个答案中的 cmets @jcollum 作为更新,您现在输入的查询将有效,而 _id 周围没有引号。【参考方案12】:甚至更容易,尤其是使用制表符完成:
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'))
这是错误的,在db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))
命令中使用这种方法将删除文档,即使 ObjectId 与指定的 id 不匹配。您需要像这样精确指定db.test.find('_id': ObjectId('4ecc05e55dd98a436ddcc47c'))
这个问题是关于find()
,而不是关于findOneAndDelete()
。以上是关于如何在 mongo 控制台中通过 ObjectId 搜索对象?的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中通过 SSH 隧道连接到 Mongo 数据库
如何检查 mongo ObjectID 在 python 中是不是有效?