使用节点 js 在 mongoDB 中创建一个新对象 ID
create a new object Id in mongoDB using node js
我正在使用以下代码将数据插入 mongodb
router.post('/NewStory', function (req, res) {
var currentObject = { user: userId , story : story , _id:new ObjectID().toHexString() };
req.db.get('clnTemple').findAndModify({
query: { _id: req.body.postId },
update: { $addToSet: { Stories: currentObject } },
upsert: true
});
});
如果我删除 _id:new ObjectID().toHexString()
,此代码工作正常
我想在这里实现的是,对于每个新故事,我都想要一个唯一的 _id 对象附加到它
我做错了什么?
{
"_id": {
"$oid": "55ae24016fb73f6ac7c2d640"
},
"Name": "some name",
...... some other details
"Stories": [
{
"userId": "105304831528398207103",
"story": "some story"
},
{
"userId": "105304831528398207103",
"story": "some story"
}
]
}
这是文档模型,我尝试创建的 _id 用于故事
您不应在此调用 .toHexString()
,因为您将获得 "string" 而不是 ObjectID。一个字符串比 ObjectId
.
的字节多 space
var async = require('async'),
mongo = require('mongodb'),
db = require('monk')('localhost/test'),
ObjectID = mongo.ObjectID;
var coll = db.get('junk');
var obj = { "_id": new ObjectID(), "name": "Bill" };
coll.findAndModify(
{ "_id": new ObjectID() },
{ "$addToSet": { "stories": obj } },
{
"upsert": true,
"new": true
},
function(err,doc) {
if (err) throw err;
console.log(doc);
}
)
所以这非常适合我。注意那里的 "new" 选项,因此返回修改后的文档,而不是默认文档的原始格式。
{ _id: 55c04b5b52d0ec940694f819,
stories: [ { _id: 55c04b5b52d0ec940694f818, name: 'Bill' } ] }
但是这里有一个问题,那就是如果你正在使用 $addToSet
and generating a new ObjectId
for every item, then that new ObjectId
makes everything "unique". So you would keep adding things into the "set". This may as well be $push
如果那是你想要做的。
因此,如果 userId
和 story
的组合已经使这个 "unique",那么请改为这样做:
coll.findAndModify(
{
"_id": docId,
"stories": {
"$not": { "$elemMatch": { "userId": userId, "story": story } }
}
},
{ "$push": {
"stories": {
"userId": userId, "story": story, "_id": new ObjectID()
}
}},
{
"new": true
},
function(err,doc) {
if (err) throw err;
console.log(doc);
}
)
因此测试数组中是否存在唯一元素,如果不存在则将它们追加到数组中。还要注意,在与 "upserts" 混合时不能对数组元素执行 "inequality match"。您对 "upsert" 文档的测试应该仅针对主“_id”值。管理数组条目和文档 "upserts" 需要在单独的更新操作中进行。不要尝试将两者混合使用,否则您最终会在不打算创建新文档的情况下创建新文档。
顺便说一下,您可以使用 monk
.
生成 ObjectID
var db = monk(credentials.database);
var ObjectID = db.helper.id.ObjectID
console.log(ObjectID()) // generates an ObjectID
我正在使用以下代码将数据插入 mongodb
router.post('/NewStory', function (req, res) {
var currentObject = { user: userId , story : story , _id:new ObjectID().toHexString() };
req.db.get('clnTemple').findAndModify({
query: { _id: req.body.postId },
update: { $addToSet: { Stories: currentObject } },
upsert: true
});
});
如果我删除 _id:new ObjectID().toHexString()
我想在这里实现的是,对于每个新故事,我都想要一个唯一的 _id 对象附加到它
我做错了什么?
{
"_id": {
"$oid": "55ae24016fb73f6ac7c2d640"
},
"Name": "some name",
...... some other details
"Stories": [
{
"userId": "105304831528398207103",
"story": "some story"
},
{
"userId": "105304831528398207103",
"story": "some story"
}
]
}
这是文档模型,我尝试创建的 _id 用于故事
您不应在此调用 .toHexString()
,因为您将获得 "string" 而不是 ObjectID。一个字符串比 ObjectId
.
var async = require('async'),
mongo = require('mongodb'),
db = require('monk')('localhost/test'),
ObjectID = mongo.ObjectID;
var coll = db.get('junk');
var obj = { "_id": new ObjectID(), "name": "Bill" };
coll.findAndModify(
{ "_id": new ObjectID() },
{ "$addToSet": { "stories": obj } },
{
"upsert": true,
"new": true
},
function(err,doc) {
if (err) throw err;
console.log(doc);
}
)
所以这非常适合我。注意那里的 "new" 选项,因此返回修改后的文档,而不是默认文档的原始格式。
{ _id: 55c04b5b52d0ec940694f819,
stories: [ { _id: 55c04b5b52d0ec940694f818, name: 'Bill' } ] }
但是这里有一个问题,那就是如果你正在使用 $addToSet
and generating a new ObjectId
for every item, then that new ObjectId
makes everything "unique". So you would keep adding things into the "set". This may as well be $push
如果那是你想要做的。
因此,如果 userId
和 story
的组合已经使这个 "unique",那么请改为这样做:
coll.findAndModify(
{
"_id": docId,
"stories": {
"$not": { "$elemMatch": { "userId": userId, "story": story } }
}
},
{ "$push": {
"stories": {
"userId": userId, "story": story, "_id": new ObjectID()
}
}},
{
"new": true
},
function(err,doc) {
if (err) throw err;
console.log(doc);
}
)
因此测试数组中是否存在唯一元素,如果不存在则将它们追加到数组中。还要注意,在与 "upserts" 混合时不能对数组元素执行 "inequality match"。您对 "upsert" 文档的测试应该仅针对主“_id”值。管理数组条目和文档 "upserts" 需要在单独的更新操作中进行。不要尝试将两者混合使用,否则您最终会在不打算创建新文档的情况下创建新文档。
顺便说一下,您可以使用 monk
.
ObjectID
var db = monk(credentials.database);
var ObjectID = db.helper.id.ObjectID
console.log(ObjectID()) // generates an ObjectID