如何在 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 搜索对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongodb 中通过 ObjectId 查找有多快?

在 Java 中通过 SSH 隧道连接到 Mongo 数据库

如何检查 mongo ObjectID 在 python 中是不是有效?

如何在没有 ObjectId 的情况下将 Mongo 与 Spring Data 一起使用

在mongoose中通过id删除

BSON::ObjectId 与 Mongo::ObjectID