【问题标题】:How do I search for an object by its ObjectId in the mongo console?如何在 mongo 控制台中通过 ObjectId 搜索对象?
【发布时间】:2012-01-04 04:52:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mongodb


    【解决方案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()
            猜你喜欢
            • 2021-09-15
            • 2017-09-17
            • 1970-01-01
            • 2013-10-09
            • 2018-12-18
            • 2018-02-20
            • 2018-02-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多