我将文档存储在MongoDB中的不同版本中。我上传了可以更改状态的同一文档的新版本。我会用GUID识别它们。
我的模特:
var Issue = new Schema({
DatePosted: {type: Date, default: Date.now}
GUID: {type: String},
Status: {type: String},
}
让我说我有一些文件:
{[
DatePosted: "2015-09-21T15:46:39.753Z",
GUID: "199b4534-8ffb-4045-a9d3-b71fc61298f4",
Status: "Status 3"
],
[
DatePosted: "2015-09-20T15:46:39.753Z",
GUID: "199b4534-8ffb-4045-a9d3-b71fc61298f4",
Status: "Status 1"
],
[
DatePosted: "2015-09-21T15:46:39.753Z",
GUID: "3c53a75e-e31e-49e4-8be0-0b94e591758f",
Status: "Status 2"
],
[
DatePosted: "2015-09-20T15:46:39.753Z",
GUID: "3c53a75e-e31e-49e4-8be0-0b94e591758f",
Status: "Status 0"
]}
我现在希望只根据GUID获取最新版本的文档。所以在这种情况下,我希望这是结果:
{[
DatePosted: "2015-09-21T15:46:39.753Z",
GUID: "199b4534-8ffb-4045-a9d3-b71fc61298f4",
Status: "Status 3"
],
[
DatePosted: "2015-09-21T15:46:39.753Z",
GUID: "3c53a75e-e31e-49e4-8be0-0b94e591758f",
Status: "Status 2"
]}
我的方法是首先获取所有唯一的GUID,然后尝试通过唯一的GUID获取每个文档的最新版本。
var guidArr = [];
Issue.find()
.where('GUID')
.distinct('GUID')
.exec(function(err, docs) {
guidArr = docs;
});
// -> guidArr = ['199b4534-8ffb-4045-a9d3-b71fc61298f4', '3c53a75e-e31e-49e4-8be0-0b94e591758f']
Issue.find({
'GUID': {$in: guidArr}}, function(err, docs) {
res.status(200).send(JSON.stringify(docs));
});
// -> docs = []
这将返回一个空对象[] ...但是如果我像
那样手动编写GUIDIssue.find({
'GUID': {$in:
['199b4534-8ffb-4045-a9d3-b71fc61298f4',
'3c53a75e-e31e-49e4-8be0-0b94e591758f']}}, function(err, docs) {
res.status(200).send(JSON.stringify(docs));
});
// -> docs = all documents in the db that has those GUIDs
这将返回集合中的所有对象(在本例中为4个文档)。
两个问题: 当我给find()一个数组(guidArr)时,为什么我得到一个空对象,但是当我给它硬编码数组时,一切似乎都在工作?
如何在第二个find()中获取最新版本的文档?
我可以在一个链式问题中对数据库执行此操作吗?我的方法似乎不是最佳实践......