Vig*_*ian 6 mongodb node.js monk
我使用以下代码将数据插入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
});
});
Run Code Online (Sandbox Code Playgroud)
如果我删除,此代码工作正常 _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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是文档模型,我试图创建的_id是故事
您不应该调用.toHexString()此方法,因为您将获得"字符串"而不是ObjectID.字符串占用的空间比a的字节多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);
}
)
Run Code Online (Sandbox Code Playgroud)
这对我来说非常适合.注意那里的"新"选项,以便返回修改后的文档,而不是默认文档的原始形式.
{ _id: 55c04b5b52d0ec940694f819,
stories: [ { _id: 55c04b5b52d0ec940694f818, name: 'Bill' } ] }
Run Code Online (Sandbox Code Playgroud)
然而,这里有一个问题,那就是如果你正在使用$addToSet并ObjectId为每个项目生成一个新项目,那么新项目ObjectId将使所有项目"独一无二".所以你会继续在"集合"中添加内容.$push如果这是您想要做的事情,也可能是这样.
因此,如果userId和story组合已经使这个"独特",那么这样做:
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);
}
)
Run Code Online (Sandbox Code Playgroud)
因此,测试数组中是否存在唯一元素,以及它们不存在的位置,然后将它们附加到数组中.还注意到,在与"upserts"混合时,你不能对数组元素进行"不等式匹配".您对"upsert"文档的测试应该只在主要的"_id"值上.管理数组条目和文档"upserts"需要处于单独的更新操作中.不要尝试混合两者,否则你最终会在你不打算创建新文档时.
| 归档时间: |
|
| 查看次数: |
7080 次 |
| 最近记录: |