我遇到了一个奇怪的mongo行为,我想稍微澄清一下......
我的请求很简单:我想在集合中获得单个文档的大小.我发现了两种可能的解决方
在这里,我提供了一些我执行测试的代码:
我创建了新的数据库'test'并输入只有一个属性的简单文档:type:"auto"
db.test.insert({type:"auto"})
Run Code Online (Sandbox Code Playgroud)stats()函数调用的输出:db.test.stats():
{
"ns" : "test.test",
"count" : 1,
"size" : 40,
"avgObjSize" : 40,
"storageSize" : 4096,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
Run Code Online (Sandbox Code Playgroud)
}
bsonsize函数调用的输出:Object.bsonsize(db.test.find({test:"auto"}))
481
Run Code Online (Sandbox Code Playgroud)我想从ObjectId对象中获取字符串字符.我用pymongo.例如:ObjectId("543b591d91b9e510a06a42e2")我想得到"543b591d91b9e510a06a42e2".
它说ObjectId.toString(),我看到了医生ObjectId.valueOf().
所以我做了这段代码:from bson.objectid import ObjectId.
但是当我使用时ObjectId.valueOf(),它显示:
'ObjectId'对象没有属性'valueOf'.
我怎么才能得到它?谢谢.
我对Mongo DB使用ObjectIds感到有些困惑.当然,它们非常适合创建ID客户端,几乎肯定不会与其他客户端创建的ID冲突.但是mongo似乎以某种特殊的方式存储它们.存储id的字符串表示与将对象id存储为对象不同.为什么是这样?
字符串表单是否具有对象表单具有的所有相同信息?mongo为什么要这么长时间来区分这两种形式呢?当我尝试比较从前端发送的_ids时,它会搞砸我.我的数据库与它是否存储字符串形式的id或对象形式id无关,而且我的代码肯定是部分责备,我主要责怪mongo让它变得如此奇怪.
我错了,这很奇怪吗?为什么mongo这样做?
考虑我们正在根据_id值从MongoDB中搜索文档.以下哪个代码有效?
ModelObj.findById(IdValue).exec(callback);
ModelObj.findOne({ '_id': IdValue}).exec(callback);
我觉得ModelObj.findById()是有效的,但有什么支持的原因或它是如何有效的?
在我的数据库中,我必须存储一个对象id数组.我该怎么用?像这样的东西:
[ObjectId("50350e12a36feb1be6000364"), ObjectId("57350e12a37fef1be6000922"), ObjectId("10350e17d34ffb1be6200925")]
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
["50350e12a36feb1be6000364", "57350e12a37fef1be6000922", "10350e17d34ffb1be6200925"]
Run Code Online (Sandbox Code Playgroud)
我可以用第二个节省空间,然后投射到ObjectId,但是我是否通过这种方法失去了任何东西?不要ObjectId小号表现得像在关系数据库中的外键?
我有两个系列
用户
{
"_id" : ObjectId("584aac38686860d502929b8b"),
"name" : "John"
}
Run Code Online (Sandbox Code Playgroud)角色
{
"_id" : ObjectId("584aaca6686860d502929b8d"),
"role" : "Admin",
"userId" : "584aac38686860d502929b8b"
}
Run Code Online (Sandbox Code Playgroud)我想基于userId(在角色集合中) - _id(在用户集合中)加入这些集合.
我尝试了以下查询:
db.role.aggregate(
{
$lookup:
{
from: 'user',
localField: 'userId',
foreignField: '_id',
as: 'output'
}
}
);
Run Code Online (Sandbox Code Playgroud)
只要我将userId存储为ObjectId,这就给了我预期的结果.当我的userId是一个字符串时,没有结果.Ps:我试过了
foreignField:'_ id'.valueOf()
和
foreignField:'_ id'.toString()
.但是基于ObjectId-string字段匹配/加入没有运气.
任何帮助将不胜感激.
我在某个时候遇到过这个 ruby object_id分配问题,然后阅读了这篇讨论VALUE的精彩文章,并解释了为什么object_id为true,nil和false的方式.当我发现有关object_id为true和nil的明显变化时,我一直在使用ruby2.0 object_id.
forbidden:~$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
forbidden:~$
forbidden:~$ irb
irb(main):001:0> true.object_id
=> 20
irb(main):002:0> false.object_id
=> 0
irb(main):003:0> nil.object_id
=> 8
irb(main):004:0> exit
forbidden:~$
forbidden:~$ rvm use 1.9.3
Using /home/forbidden/.rvm/gems/ruby-1.9.3-p392
forbidden:~$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
forbidden:~$
forbidden:~$ irb
irb(main):001:0> true.object_id
=> 2
irb(main):002:0> false.object_id
=> 0
irb(main):003:0> nil.object_id
=> 4
Run Code Online (Sandbox Code Playgroud)
tl; dr: true和nil的值在1.9.3和1.8.7中分别为2,4,但在ruby2.0.0中已经更改为20,8,即使id为false仍然相同,即0和Fixnum的ID保持相同的旧2n + 1模式.
此外,Fixnum和Bignum的实现方式在2.0.0中仍然相同,因为上面提到的文章中给出的示例运行方式与以前相同:
irb(main):001:0>
irb(main):002:0* ((2**62)).class
=> Bignum
irb(main):003:0> ((2**62)-1).class
=> …Run Code Online (Sandbox Code Playgroud) 在玩了对象id之后我发现了这个.
ObjectSpace._id2ref(2648)
=> :**
ObjectSpace._id2ref(6688)
=> :**
ObjectSpace._id2ref(2648) == ObjectSpace._id2ref(6688)
=> false
Run Code Online (Sandbox Code Playgroud)
第一个是求幂运算符的符号;
2.send(ObjectSpace._id2ref(2648), 3)
=> 8
2.send(ObjectSpace._id2ref(6688), 3)
NoMethodError: undefined method `**' for 2:Fixnum
Run Code Online (Sandbox Code Playgroud)
但第二个不知何故不是?我认为它们在传递给#print之后看起来一样.但是,什么是区别?其中一个是某种形式的unicode符号吗?
更新:第二个可能是关键字参数的新双splat,但我似乎无法验证这一点.
我知道当文档插入集合时,_id列如何包含时间戳的表示.这是一个将其转换为时间戳的在线实用程序:http://steveridout.github.io/mongo-object-time/
我想知道的是,对象id字符串本身是否保证维持升序?即这种比较总是返回真实吗?
"newest object id" > "second newest object id"
我正在尝试将类型转换primitive.ObjectID为stringGo 中的类型。我正在使用mongo-driverfrom go.mongodb.org/mongo-driver.
我尝试使用类型断言
mongoId := mongoDoc["_id"];
stringObjectID := mongoId.(string)
Run Code Online (Sandbox Code Playgroud)
哪个 VSCode 接受。代码被编译,当它到达这个特定的代码行时,它会抛出这个错误
panic: interface conversion: interface {} is primitive.ObjectID, not string
Run Code Online (Sandbox Code Playgroud)