mongoDB:为每个添加到数组字段的新子项创建一个ObjectId

时间:2016-01-28 00:21:26

标签: mongodb

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并事先将其添加到孩子身上?

2 个答案:

答案 0 :(得分:9)

不是if专家,但是,如果我理解正确,您希望自动插入子文档的_id字段。

我创建了mongodb db,然后使用以下命令在threads集合中插入了第一个message

messages

请注意db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]}); 字段。结果如下:

enter image description here

现在我有一个_id:ObjectId(),我可以更新该特定记录并向其中插入更多消息。命令如下:

ObjectId(56...)

以上内容会在集合中插入新消息。见下面的截图:

enter image description here

最后经过一些更新后,该集合看起来如下:

enter image description here

自动生成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函数调用

中使用ObjectID和消息应插入的线程的文档ID
findOneAndUpdate

测试两者并且工作得很好。请参见下面的屏幕截图:

enter image description here

答案 1 :(得分:-1)

很抱歉协议的执行,但是我没有足够的代表来评论主线程。

我一直在研究如何使用JSON来生成ObjectID()插入,并且在旅行中发现该解决方案对于索引并不是很好。提出的解决方案的_id值是字符串,而不是实际的对象ID,即 “ 56a970405ba22d16a8d9c30e”与ObjectId("56a970405ba22d16a8d9c30e")不同,并且使用该字符串的索引编制会变慢。 ObjectId实际上在内部表示为16 bytes