Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoose重新运行nModified:1,当没有更新数据时_Mongodb_Mongoose - Fatal编程技术网

Mongodb Mongoose重新运行nModified:1,当没有更新数据时

Mongodb Mongoose重新运行nModified:1,当没有更新数据时,mongodb,mongoose,Mongodb,Mongoose,试图了解为什么/如果mongoose在没有数据更改的情况下更新我的文档 如果我用下面的查询保存一个新文档,它将在console.log(item)中返回 质疑 如果我再次运行相同的查询,我会将其返回。这表示文档已修改,但数据相同,没有插入新数据。 {n:1,nModified:1,ok:1} const newProduct = { ean: product.ean, productName: product.productName,

试图了解为什么/如果mongoose在没有数据更改的情况下更新我的文档

如果我用下面的查询保存一个新文档,它将在console.log(item)中返回

质疑

如果我再次运行相同的查询,我会将其返回。这表示文档已修改,但数据相同,没有插入新数据。
{n:1,nModified:1,ok:1}

const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          stores: [{
            name: "foobar",
           }],
        };
 const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          
        };
我注意到,如果我删除stores数组,删除文档,再次插入它,然后在console.log(项)中重新运行我得到的查询
{n:1,nModified:0,ok:1}

我运行相同的查询,时间相同,但是当对象中有一个数组时,我得到这个
{n:1,nModified:1,ok:1}
,当没有数组时,我得到这个
{n:1,nModified:0,ok:1}

const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          stores: [{
            name: "foobar",
           }],
        };
 const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          
        };
似乎在使用数组时,文档会被修改,而不管数据是否更改

例1 给出
{n:1,nModified:1,ok:1}

const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          stores: [{
            name: "foobar",
           }],
        };
 const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          
        };
例2 给出
{n:1,nModified:0,ok:1}

const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          stores: [{
            name: "foobar",
           }],
        };
 const newProduct = {
          ean: product.ean,
          productName: product.productName,
          lowestPrice: product.productPrice,
          mainCategory: categories.mainCategory,
          group: categories.group,
          subCategory: categories.subCategory,
          subSubCategory: subSubCat,
          
        };
是我误解了下面的操作还是发生了什么? 我想做的是:

1.如果基于productName的文档不存在,请插入

2.如果存储在数据库中的文档与新产品存在差异,请更新文档

3.如果没有什么不同,就什么也不做

产品模型

const ProductSchema = new Schema({
  ean: String,
  productName: String,
  mainCategory: String,
  subCategory: String,
  group: String,
  subSubCategory: String,
  lowestPrice: Number,
  isPopular: Boolean,
  description: String,

  stores: [
    {
      name: String,
      
    },
  ],
});
编辑:因为这很难解释,我创建了一个小型回购协议来说明这个问题


数据库仍在执行更新。

例如,让我们有条件地向上插入一个值:

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.update({a:42},{a:42},{upsert:true})
WriteResult({
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("5f3d4ed509fcd40c9f092690")
})
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.update({a:42},{a:42},{upsert:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
第一次写入是插入,第二次写入是更新。第二次写入未更改任何数据,但数据库执行了写入操作

您可以通过在另一个shell实例中使用更改流来验证是否存在写入:

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.watch()
{ "_id" : { "_data" : "825F3D4ED5000000012B022C0100296E5A1004FAC29486D5A3459A8726349007F2E43E46645F696400645F3D4ED509FCD40C9F0926900004" }, "operationType" : "insert", "clusterTime" : Timestamp(1597853397, 1), "fullDocument" : { "_id" : ObjectId("5f3d4ed509fcd40c9f092690"), "a" : 42 }, "ns" : { "db" : "test", "coll" : "foo" }, "documentKey" : { "_id" : ObjectId("5f3d4ed509fcd40c9f092690") } }
{ "_id" : { "_data" : "825F3D4ED6000000012B022C0100296E5A1004FAC29486D5A3459A8726349007F2E43E46645F696400645F3D4ED509FCD40C9F0926900004" }, "operationType" : "replace", "clusterTime" : Timestamp(1597853398, 1), "fullDocument" : { "_id" : ObjectId("5f3d4ed509fcd40c9f092690"), "a" : 42 }, "ns" : { "db" : "test", "coll" : "foo" }, "documentKey" : { "_id" : ObjectId("5f3d4ed509fcd40c9f092690") } }
根据定义,upsert要么修改符合条件的文档,要么插入新文档。你总是会有一个写作时,上升

2.如果数据库中存储的文档与新产品有所不同,请更新文档


粗体部分不是MongoDB(据我所知,大多数数据库)的工作方式。是否执行写入并不取决于正在写入的数据是否与数据库中已有的数据相同。

“为什么当我在要插入的对象中有一个数组时文档会被修改,而当没有数组时文档不会被修改?”解释第二部分。我已经更新了问题,希望我所说的更清楚一点,您添加了两个新产品。它们是否与您在上面两行中描述的怀疑有关?这是为了显示是否插入数组的差异。如果我有一个数组,我会得到
nModified:1
,如果没有,我会得到
nModified:0
在这两种情况下集合中都有什么?谢谢回答,但我不明白为什么我在运行带有数组的更新时得到nModified:1,而没有数组的情况下得到nModified:0?我只看到文章顶部的一个更新。如果您测试了其他更新,请将它们作为mongoshell命令添加到问题中。这是相同的更新查询,但我插入了两个不同的对象。示例1有一个数组(存储),示例2没有。插入示例1时,我得到了nModified:1返回。插入示例2时,我得到了nModified:0。(我在帖子中添加了exmaple 1和2文本)我看到一些mongoose声明,但MongoShell中没有可运行的代码。我真的不知道如何使用MongoShell,抱歉。我在github上创建了一个小项目,其中包含运行并显示问题的代码。