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 Stateslocation
中的使用将接受上述定义中的任何内容。有关更详细的用法,请参阅上的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 Stateslocation
中的使用将接受上述定义中的任何内容。有关更详细的用法,请参阅上的mongoose文档
这将与您的update语句一起使用。然而我