猫鼬用错误的key:value值根据文档创建文档

时间:2019-04-02 23:58:47

标签: javascript node.js mongodb mongoose mongoose-schema

因此,我对理解Mongo .create.findAndUpdate操作的工作方式有疑问。我有猫鼬5.4.2X和一个具有模式的模型,该模式具有许多key:value对(没有任何嵌套对象)的确切顺序(在下面的代码中,我使用1. 2. 3. etc显示)像这样

let schema = new mongoose.Schema({
    1.code: {
        type: String,
        required: true
    },
    2.realm: {
        type: String,
        required: true,
    },
    3.type: {
        type: String,
        required: true,
        enum: ['D', 'M'],
    },
    4.open: Number,
    5.open_size: Number,
    6.key: typeof value,..
    7...another one key: value like previous one,
    8.VaR_size: Number,
    9.date: {
        type: Date,
        default: Date.now,
        required: true
    }
});

class对象,它们具有以相同顺序完全相同的属性

当我通过const contract = new Class_name (data)并使用console.log(contract)为Mongo形成数据时,我有一个必需的对象,其属性以完全正确的顺序显示,例如:

Contract {1.code: XXX, 2.realm: YYY, 3.type: D, .... 8.VaR_size: 12, 9.date: 327438}

,但是当我尝试通过findOneAndUpdate或(findByID)将文档创建/更新到数据库时,它以字母顺序书写,但不是必需的1-> 9,例如:

_id:5ca3ed3f4a547d4e88ee55ec
1.code:"RVBD-02.J"
7.VaR:0.9
(not the 1->9)...:...
8.VaR_size:0.22
__v:0
5.avg:169921

用于编写的完整代码段为:

        let test = await contracts.findOneAndUpdate(
            { 
                code: `${item_ticker}-${moment().subtract(1, 'day').format('DD.MMM')}`  //how to find
            }, 
            contract, //document for writinng and options below
            {
                upsert : true,
                new: true,
                setDefaultsOnInsert: true,
                runValidators: true,
                lean: true
            }
        ).exec();
  

是的,我已阅读过猫鼬文档,但未找到任何选项参数   解决我的问题或一些可选的参数很重要,但是   没有对此的描述。

     

这不是我的第一个项目,有趣的是,当我插入   根据模式插入了.insertMany个文档中的大量文档   顺序(不是字母顺序)

我唯一的问题是:

  

我该如何解决?是否有任何选项参数,或者它是findAnd....的一部分   操作?如果没有解决方案,那对我来说应该怎么办   必需正确排序并检查文件是否存在   插入吗?

一段时间后我更新了#1,我重新搜索了google搜索查询,并在此处找到有关SW的相关问题:MongoDB field order and document position change after update

1 个答案:

答案 0 :(得分:0)

猜猜我根据我之前发布的链接找到了正确的答案。是的,它是MongoDB的一部分:

  

MongoDB根据特定的填充为新文档分配空间   因子。如果您的更新使文档的大小超出了   最初分配给文档的尺寸将被移动到   采集。相同的概念适用于文档中的字段。

通过@ {Bernie Hackett


但是在这个有用的评论中,仍然没有解决办法,对吗?错误。看来,避免这种情况的唯一方法是在Model.find阶段使用附加的可选参数。在project阶段通过.aggregate使用相同的顺序,看起来像这样:

Model.find({query},{
   "field_one":1,
   "field_two":1,
   .............
   "field_last":1
});