如何在mongodb中组合两个集合?

时间:2017-06-08 13:46:17

标签: javascript mongodb

我想要合并两个集合(“消息”和“日期”)。 集合“messages”包含如下文档:

{ 
    "_id" : ObjectId("4f16fc97d1e2d32371003e27"), 
    "body" : "the scrimmage is still up in the air...\n\n\nwebb said that they didnt want to scrimmage...\n\nthe aggies  are scrimmaging each other... (the aggie teams practiced on \nSunday)\n\nwhen I called the aggie captains to see if we could use their field.... they \nsaid that it was tooo smalll for us to use...\n\n\nsounds like bullshit to me... but what can we do....\n\n\nanyway... we will have to do another practice Wed. night....    and I dont' \nknow where we can practice.... any suggestions...\n\n\nalso,  we still need one  more person...", 
    "subFolder" : "notes_inbox", 
    "mailbox" : "bass-e", 
    "filename" : "450.", 
    "X-cc" : "", 
    "From" : "michael.simmons@enron.com", 
    "Subject" : "Re: Plays and other information", 
    "X-Folder" : "\\Eric_Bass_Dec2000\\Notes Folders\\Notes inbox", 
    "Content-Transfer-Encoding" : "7bit", 
    "X-bcc" : "", 
    "To" : "eric.bass@enron.com", 
    "X-Origin" : "Bass-E", 
    "X-FileName" : "ebass.nsf", 
    "X-From" : "Michael Simmons", 
    "Date" : "Tue, 14 Nov 2000 08:22:00 -0800 (PST)", 
    "X-To" : "Eric Bass", 
    "Message-ID" : "<6884142.1075854677416.JavaMail.evans@thyme>", 
    "Content-Type" : "text/plain; charset=us-ascii", 
    "Mime-Version" : "1.0", 
}

集合“date”包含如下文档:

{ 
    "_id" : ObjectId("4f16fc97d1e2d32371003e27"), 
    "year" : NumberInt(2000), 
    "month" : NumberInt(11), 
    "day" : NumberInt(14)
}

应将日期,月份和年份插入到收集邮件中。我尝试了不同的方法,但没有找到任何解决方案。

我尝试过的一个例子:

db.messages.aggregate([
    {
        $lookup:
        {
            from: "date",
            localField: "Date",
            foreignField: "year",
            as: "Year"

        }
    }
])

1 个答案:

答案 0 :(得分:0)

用户@Vanojx在评论中提出的问题,

  

你匹配“星期二,2000年11月14日08:22:00 -0800(太平洋标准时间)”和“2000”

但是,为什么消息集合中的Date字段是RFC格式并存储为字符串?它应该以ISO格式存储为Date对象。

根据这个SO post,聚合框架不能在v8引擎中运行,你也没有JS函数来对字符串进行操作。

除了操纵字符串以从中提取“2000”之外,稍后用于加入“日期”集合对我来说听起来不是正确的方法。

如果可能,请将其从字符串转换为Date对象。要将日期字段转换为Date对象,您可以执行此操作,

//please make back up of your db just incase
db.messages.find({}).forEach(function (doc) {
    doc.Date = new Date(doc.Date);
    db.messages.save(doc);
});

将“日期”字段从字符串转换为日期对象后,以下查询应该适合您。

db.messages.aggregate([
    {
        $project: {
            body: 1,
            subFolder: 1,
            Date: 1,
            //add other properties as you need
            //you could even do following which will give you all fields of the document
            //document: "$$ROOT"

            year: {$year: "$Date"}
        }        
    },
    {
        $lookup: {
            from: "date",
            localField: "year",
            foreignField: "year",
            as: "Year"
        }
    }
    ])

这里我们首先使用$year从Date字段中提取年份。然后我们将在该字段上使用$lookup加入。

我希望这会有所帮助。