Mongodb 没有 _id 找不到

Mongodb find not find without _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 的情况下进行搜索时,它对我来说 return 没有任何意义:

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

当我使用 _id 搜索时,return 对我来说结果很好:

> 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 () 命令没有 return 错误。

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,因此一些跟踪可能索引不正确...


解决方案:

value 字段的值大于 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();
});

我找到了解决方案...

value 字段的值大于 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();
});