Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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
Javascript 文档内部的mongoDB数组_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 文档内部的mongoDB数组

Javascript 文档内部的mongoDB数组,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,当我更新此数据时,deslon和deslat部分不会插入文档中 var locationData = { update_time: new Date() , location: [ {curlon: req.payload.loclon , curlat: req.payload.loclat}, {deslon: req.payload.deslon , deslat: req.pa

当我更新此数据时,
deslon
deslat
部分不会插入文档中

var locationData = { update_time: new Date() , 
                  location: [ 
                  {curlon: req.payload.loclon , curlat: req.payload.loclat},
                  {deslon: req.payload.deslon , deslat: req.payload.deslat}
                                   ]};
更新

userLocationModel.update({uid: req.params.accesskey}, locationData, { upsert: true }, function (err, numberAffected, raw) {
//DO SOMETHING
                });
我不明白为什么会这样

这是插入的mongo文档。即使创建了新文档,
deslon
deslat
也会丢失。

{
  _id: ObjectId("52f876d7dbe6f9ea80344fd4"),
  location: [
    {
      curlon: 160,
      curlat: 160,
      _id: ObjectId("52f8788578aa340000e51673")
    },
    {
      _id: ObjectId("52f8788578aa340000e51672")
    }
  ],
  uid: "testuser6",
  update_time: ISODate("2014-02-10T06:58:13.790Z")
}
另外:如果文档经常更新,我是否应该使用这样的结构。

{
  _id: ObjectId("52f876d7dbe6f9ea80344fd4"),
  location: [
    {
      curlon: 160,
      curlat: 160,
      _id: ObjectId("52f8788578aa340000e51673")
    },
    {
      _id: ObjectId("52f8788578aa340000e51672")
    }
  ],
  uid: "testuser6",
  update_time: ISODate("2014-02-10T06:58:13.790Z")
}
这就是猫鼬模型:

var userLocationSchema = mongoose.Schema({

    uid: String,                //same as the user access key
    update_time: Date,          //time stamp to validate, insert when updating. created by server.  

    location:[                
        {
            curlon: Number,         //current location in latitude and longitude <INDEX>
            curlat: Number
        },
        {
            deslon: Number,         //destination in latitude and longitude <INDEX>
            deslat: Number
        }
        ]
});
var userLocationSchema=mongoose.Schema({
uid:String,//与用户访问密钥相同
更新时间:日期,//要验证的时间戳,在更新时插入。由服务器创建。
地点:[
{
curlon:Number,//纬度和经度的当前位置
科拉特:号码
},
{
deslon:Number,//纬度和经度的目的地
德斯拉特:号码
}
]
});

我想更新这两个元素。我不想插入一个新的。但是,即使我更新了一个不存在的文档(即,这会导致创建一个新文档),deslon和deslat也会丢失。

您必须告诉mongo如何更新数据。因此,在更新数据中添加一个简单的
$set

var locationData = {
    $set: {
        update_time: new Date(), 
        location: [ 
            {curlon: req.payload.loclon , curlat: req.payload.loclat},
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };
编辑:

如果不想整体交换
location
属性,而是要在数组中插入新项,请使用:

var locationData = {
    $set: {
        update_time: new Date() 
    },
    $push: {
        location: [ 
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };

您应该考虑的是,如果将当前位置和目的地放在一个数组中,仅仅是因为它们具有相同的属性(LON/LAT),这是一个好主意。例如,如果始终存在一个当前位置和零到多个目的地,则可以将当前位置放入单独的属性中

要修改阵列中的特定位置,可以通过对其进行寻址

var index = 2, // this is an example 
    arrayElement = 'location.' + n,
    locationData = { $set: {} };

locationData.$set[arrayElement] = {deslon: req.payload.deslon , deslat: req.payload.deslat};

userLocationModel.update({uid: req.params.accesskey}, locationData );

您必须告诉mongo如何更新数据。因此,在更新数据中添加一个简单的
$set

var locationData = {
    $set: {
        update_time: new Date(), 
        location: [ 
            {curlon: req.payload.loclon , curlat: req.payload.loclat},
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };
编辑:

如果不想整体交换
location
属性,而是要在数组中插入新项,请使用:

var locationData = {
    $set: {
        update_time: new Date() 
    },
    $push: {
        location: [ 
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };

您应该考虑的是,如果将当前位置和目的地放在一个数组中,仅仅是因为它们具有相同的属性(LON/LAT),这是一个好主意。例如,如果始终存在一个当前位置和零到多个目的地,则可以将当前位置放入单独的属性中

要修改阵列中的特定位置,可以通过对其进行寻址

var index = 2, // this is an example 
    arrayElement = 'location.' + n,
    locationData = { $set: {} };

locationData.$set[arrayElement] = {deslon: req.payload.deslon , deslat: req.payload.deslat};

userLocationModel.update({uid: req.params.accesskey}, locationData );

您必须告诉mongo如何更新数据。因此,在更新数据中添加一个简单的
$set

var locationData = {
    $set: {
        update_time: new Date(), 
        location: [ 
            {curlon: req.payload.loclon , curlat: req.payload.loclat},
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };
编辑:

如果不想整体交换
location
属性,而是要在数组中插入新项,请使用:

var locationData = {
    $set: {
        update_time: new Date() 
    },
    $push: {
        location: [ 
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };

您应该考虑的是,如果将当前位置和目的地放在一个数组中,仅仅是因为它们具有相同的属性(LON/LAT),这是一个好主意。例如,如果始终存在一个当前位置和零到多个目的地,则可以将当前位置放入单独的属性中

要修改阵列中的特定位置,可以通过对其进行寻址

var index = 2, // this is an example 
    arrayElement = 'location.' + n,
    locationData = { $set: {} };

locationData.$set[arrayElement] = {deslon: req.payload.deslon , deslat: req.payload.deslat};

userLocationModel.update({uid: req.params.accesskey}, locationData );

您必须告诉mongo如何更新数据。因此,在更新数据中添加一个简单的
$set

var locationData = {
    $set: {
        update_time: new Date(), 
        location: [ 
            {curlon: req.payload.loclon , curlat: req.payload.loclat},
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };
编辑:

如果不想整体交换
location
属性,而是要在数组中插入新项,请使用:

var locationData = {
    $set: {
        update_time: new Date() 
    },
    $push: {
        location: [ 
            {deslon: req.payload.deslon , deslat: req.payload.deslat}
        ]
    };

您应该考虑的是,如果将当前位置和目的地放在一个数组中,仅仅是因为它们具有相同的属性(LON/LAT),这是一个好主意。例如,如果始终存在一个当前位置和零到多个目的地,则可以将当前位置放入单独的属性中

要修改阵列中的特定位置,可以通过对其进行寻址

var index = 2, // this is an example 
    arrayElement = 'location.' + n,
    locationData = { $set: {} };

locationData.$set[arrayElement] = {deslon: req.payload.deslon , deslat: req.payload.deslat};

userLocationModel.update({uid: req.params.accesskey}, locationData );

我对这个结构有一个真正的问题,但是,哦,好吧

这样做的模式是错误的。因此还有多余的
\u id
条目。要想做你想做的事,你需要这样的东西:

var currentSchema = mongoose.Schema({
  curlon: Number,
  curlat: Number
});

var destSchema = mongoose.Schema({
  destlon: Number,
  destlat: Number
});

var userLocationSchema = mongoose.Schema({

  uid: String,
  update_time: Date,

  location: [ ]

});
这就是mongoose希望您处理嵌入式文档的方式。这将允许在您正在使用的表单中进行更新

另外,您在
upsert
上的逻辑错误,因为您没有包含更新文档部分中找不到的新的uid。您应该查看MongoDB文档中的内容,或者随时更新它

实际上,我只是告诉你如何分离模式。由于您在code States
location
中的使用将接受上述定义中的任何内容。有关更详细的用法,请参阅上的mongoose文档


这将与您的update语句一起使用。然而,我强烈建议您重新考虑这个模式结构,特别是当您打算使用数据进行地理空间工作时。那超出了这个问题的范围。快乐的谷歌搜索。

我对这种结构有一个真正的问题,但是,哦,好吧

这样做的模式是错误的。因此还有多余的
\u id
条目。要想做你想做的事,你需要这样的东西:

var currentSchema = mongoose.Schema({
  curlon: Number,
  curlat: Number
});

var destSchema = mongoose.Schema({
  destlon: Number,
  destlat: Number
});

var userLocationSchema = mongoose.Schema({

  uid: String,
  update_time: Date,

  location: [ ]

});
这就是mongoose希望您处理嵌入式文档的方式。这将允许在您正在使用的表单中进行更新

另外,您在
upsert
上的逻辑错误,因为您没有包含更新文档部分中找不到的新的uid。您应该查看MongoDB文档中的内容,或者随时更新它

实际上,我只是告诉你如何分离模式。由于您在code States
location
中的使用将接受上述定义中的任何内容。有关更详细的用法,请参阅上的mongoose文档

这将与您的update语句一起使用。然而我