我有一个mongo集合,其中的文档有一个数组字段。我希望能够发布文档中的所有内容,除了一天前创建的数组中的元素。我怀疑答案与这个问题有些相似。
Meteor publication: Hiding certain fields in an array document field?
我只想限制正在发布的数组中的元素,而不是限制数组中的字段。
提前感谢您的回复!
修改
以下是一个示例文档:
{
_id: 123456,
name: "Unit 1",
createdAt: (datetime object),
settings: *some stuff*,
packets: [
{
_id: 32412312,
temperature: 70,
createdAt: *datetime object from today*
},
{
_id: 32412312,
temperature: 70,
createdAt: *datetime from yesterday*
}
]
}
除了24小时前创建的数组部分之外,我想获取此文档中的所有内容。我知道我可以通过将数据包移动到他们自己的集合中并将它们与关系数据库中的密钥绑在一起来实现这一点,但如果我要求的是可能的话,那么用更少的代码就可以更简单。
答案 0 :(得分:1)
您可以在发布方法中执行以下操作:
var esriMap = new Map(mapId, {
basemap:"satellite",
center :[-97.031, 37.638],
zoom :4,
slider :false
});
esriMap.on("click", lang.hitch(this, function (evt) {
alert("click esrimap");
}));
尽管您可能最好将最近24小时的数据包存储为文档中的单独数组。可能会减少对服务器的负担,不确定。
此外,上面的代码未经测试。祝你好运。
答案 1 :(得分:1)
你可以使用$ elemMatch投影 http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/
所以在你的情况下,它将是
var today = new Date();
var yesterday = new Date(today);
yesterday.setDate(today.getDate() - 1);
collection.find({}, //find anything or specifc
{
fields: {
'packets': {
$elemMatch: {$gt : {'createdAt' : yesterday /* or some new Date() */}}
}
}
});
但是,$ elemMatch仅返回符合条件的 FIRST 元素。要返回多于1个元素,您需要使用aggregation框架,它比_.each或forEach更有效,特别是如果您有一个大型数组要循环。
collection.rawCollection().aggregate([
{
$match: {}
},
{
$redact: {
$cond: {
if : {$or: [{$gt: ["$createdAt",yesterday]},"$packets"]},
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}], function (error, result ){
});
以类似于find({})的方式指定$ match。然后,所有符合条件的文档都会被提交到由$ cond。
指定的$ redact中$ redact从顶层到底层扫描文档。在顶层,您有_id,name,createdAt,设置,数据包;因此{$或:[***," $ packets"]}
$中存在$ packet或允许$ redact扫描包含_id,temperature和createdAt的第二级;因此{$ gt:[" $ createdAt",昨天]}
这是异步的,您可以使用Meteor.wrapAsync来包装该函数。
希望这个帮助