mongodb 2.1.4(节点驱动程序)
我正在尝试为插入数组的每条消息创建一个新的ObjectID(该数组是一个子文档)。
我这样想 - 可以轻松地对阵列中的每条消息执行所有CRUD操作。
例如:
“threads”集合(注意 - 每条消息的ObjectId)
{
"_id": ObjectId("1234132413424123"), //A thread id
messages:[
{
_id :ObjectId("134124412341234"),// A message id
"message":"MongoDB is my friend"
},
{
_id :ObjectId("534124412342377"),
"message":"MongoDB is my friend too"
},
...
]
},
{
"_id": ObjectId("22341324134224234"),
messages:[
{
_id :ObjectId("8341244123411235"),
"message":"Something clever"
},
{
_id :ObjectId("134124412342376"),
"message":"blah blah blah"
},
...
]
}
我现在正在做的事情:
var query = {};
query["_id"] = new ObjectID(threadID);
var update = {$push: {}}; //I write the update object externally just for aesthetics
update.$push["messages"] = newMessage;
var threadsCollection = db.collection('threads');
threadsCollection.findOneAndUpdate(query,update, function (err, result) {
if (err) {
console.log(err);
}
db.close();
});
问题:
与集合的“insert”不同,使用$ push的更新不会创建 添加到数组的每条消息的新ObjectId。
问题:
是否有一种在$ push期间创建ObjectID的标准方法 孩子阵列?或者我们应该手动创建一个ObjectID并事先将其添加到孩子身上?
答案 0 :(得分:9)
不是if
专家,但是,如果我理解正确,您希望自动插入子文档的_id字段。
我创建了mongodb
db,然后使用以下命令在threads
集合中插入了第一个message
:
messages
请注意db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
字段。结果如下:
现在我有一个_id:ObjectId()
,我可以更新该特定记录并向其中插入更多消息。命令如下:
ObjectId(56...)
以上内容会在集合中插入新消息。见下面的截图:
最后经过一些更新后,该集合看起来如下:
自动生成db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
数组中的所有_id字段。
出于各种原因使用messages
字段可能不是一个好主意。有关是否使用_id作为子文档的密钥的更多详细信息,请谷歌。
我使用 MongoDB shell 3.0.6版作为命令。
编辑28-01-2016 16:09
由于上述解决方案基于MongoDB shell,我决定使用Node.js驱动程序为MongoDB做另一个测试。首先,我将ObjectID变量声明为
_id
我将在我的var ObjectID = require('mongodb').ObjectID;
和update
函数调用
findOneAndUpdate
测试两者并且工作得很好。请参见下面的屏幕截图:
答案 1 :(得分:-1)
很抱歉协议的执行,但是我没有足够的代表来评论主线程。
我一直在研究如何使用JSON
来生成ObjectID()
插入,并且在旅行中发现该解决方案对于索引并不是很好。提出的解决方案的_id值是字符串,而不是实际的对象ID,即
“ 56a970405ba22d16a8d9c30e”与ObjectId("56a970405ba22d16a8d9c30e")
不同,并且使用该字符串的索引编制会变慢。 ObjectId
实际上在内部表示为16 bytes
。