Mongodb找不到没有_id



搜索与我的数据库在生产中的工作方式很奇怪:如果我不指定_id,它找不到对象。

当我仅使用_id进行搜索时,它可以工作:

MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:hidevalue000/hidevalue001
MongoDB server version: 3.6.2
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> db.trackings.find({_id:ObjectId('hidevalue002')}).pretty()
{
"_id" : ObjectId("hidevalue002"),
"public" : false,
"creation_date" : ISODate("2018-03-08T09:43:27.661Z"),
"user_id" : ObjectId("hidevalue003"),
"apikey" : "hidevalue004",
"type" : "autodiag",
"key" : "autodiag_data",
"value" : "hidevalue005",
"__v" : 0
}
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> 

当我在没有_id的情况下进行搜索时,它不会向我返回任何内容:

> hidevalue001:PRIMARY> db.trackings.find(
... {
...     "user_id" : ObjectId("hidevalue003"),
...     "apikey" : "hidevalue004",
...     "type": "autodiag",
...     "key" : "autodiag_data"
... }).pretty()
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> 

当我用_id搜索时,它很好地返回了我结果:

> hidevalue001:PRIMARY> db.trackings.find(
... {
...     "_id" : ObjectId("hidevalue002"),
...     "user_id" : ObjectId("hidevalue003"),
...     "apikey" : "hidevalue004",
...     "type": "autodiag",
...     "key" : "autodiag_data",
... }).pretty()
{
"_id" : ObjectId("hidevalue002"),
"public" : false,
"creation_date" : ISODate("2018-03-08T09:43:27.661Z"),
"user_id" : ObjectId("hidevalue003"),
"apikey" : "hidevalue004",
"type" : "autodiag",
"key" : "autodiag_data",
"value" : "hidevalue005",
"__v" : 0
}
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> 

基数中的跟踪总数:

> hidevalue001:PRIMARY> db.trackings.find().count()
38330

MongoDB 索引由 Mongoose 版本 5.0.1 (NodeJS) 配置:

// Init
var trackingsSchema = new mongoose.Schema(
{
user_id:       { type:mongoose.Schema.Types.ObjectId },
apikey:        { type:String },
type:          { type:String },
key:           { type:String },
value:         { type:String },
public:        { type:Boolean, default:false },
creation_date: { type:Date, default:Date.now }
});
// Set index
trackingsSchema.index(
{
'user_id': 1,
'apikey':  1,
'type':    1,
'key':     1,
'value':   1,
'public':  1,
'creation_date':-1
}, { name: 'hidevalue006' });

编辑:

如果我在搜索中删除user_id,那么我就会找到我的文档。

> hidevalue001:PRIMARY> db.trackings.find(
... {
...     "apikey" : "hidevalue004",
...     "type": "autodiag",
...     "key" : "autodiag_data",
...     "creation_date" : ISODate("2018-03-08T09:43:27.661Z")
... }).pretty()
{
"_id" : ObjectId("hidevalue002"),
"public" : false,
"creation_date" : ISODate("2018-03-08T09:43:27.661Z"),
"user_id" : ObjectId("hidevalue003"),
"apikey" : "hidevalue004",
"type" : "autodiag",
"key" : "autodiag_data",
"value" : "hidevalue005",
"__v" : 0
}
> hidevalue001:PRIMARY> 
> hidevalue001:PRIMARY> 

db.trackings.validate ()命令不会返回错误。

hidevalue001:PRIMARY> db.trackings.validate()
{
"ns" : "hidevalue000.hidevalue001",
"nInvalidDocuments" : NumberLong(0),
"nrecords" : 39024,
"nIndexes" : 2,
"keysPerIndex" : {
"hidevalue002.trackings.$_id_" : 39024,
"hidevalue002.trackings.$hidevalue003" : 38494
},
"valid" : true,
"warnings" : [
"Some checks omitted for speed. use {full:true} option to do more thorough scan."
],
"errors" : [ ],
"ok" : 1
}

编辑:

我试过db.trackings.reIndex(),同样的结果。


编辑:

我创建了一个新集合并重新索引我的所有文档,结果相同,如果我指定user_id,我找不到我的文档。

> db.createCollection('trackings_v2');
> 
> 
> db.trackings_v2.createIndex(
{
'user_id':       1
'apikey':        1
'type':          1
'key':           1
'value':         1
'ip':            1
'public':        1
'creation_date': 1
},
{ name: 'hidevalue010' });
> 
> 
> db.trackings.find({}).forEach(function(e)
{
delete e._id;
delete e.__v;
db.trackings_v2.update(e, e, {upsert:true});
})
> 
> 

编辑:

有些跟踪使用相同的user_id,所以一些跟踪可能索引很糟糕......


溶液:

值字段的值大于 1024 字节,如果我们不指定它,mongoDB 不喜欢大值......我不认为他不会在上面放任何日志......

更改跟踪索引 :

trackingsSchema.index(
{
'user_id': 1,
'apikey':  1,
'type':    1,
'key':     1,
'value':   'text',
'public':  1,
'creation_date':-1
}, { name: 'hidevalue006' });

重新索引所有集合(或仅跟踪):

db.getCollectionNames().forEach(function(collname)
{
db.getCollection(collname).reIndex();
});

我找到了解决方案...

值字段的值大于 1024 字节,如果我们不指定它,mongoDB 不喜欢大值......我不认为他不会在上面放任何日志......

更改跟踪索引 :

trackingsSchema.index(
{
'user_id': 1,
'apikey':  1,
'type':    1,
'key':     1,
'value':   'text',
'public':  1,
'creation_date':-1
}, { name: 'hidevalue006' });

重新索引所有集合(或仅跟踪):

db.getCollectionNames().forEach(function(collname)
{
db.getCollection(collname).reIndex();
});

最新更新