我怎样才能过滤掉重复的和空的文档以及用 JavaScript 订购 MongoDB Collection?
How can I filter out duplicate and empty documents as well as order a MongoDB Collection with JavaScript?
获取 MongoDB collection 中的所有数据非常简单。您只需使用 Collection 实例名称并调用 find:
TimeAndSpace = new Mongo.Collection('timeAndSpace');
if (Meteor.isClient) {
. . .
Template.placesLived.helpers({
places: function () {
// this helper returns a cursor of all of the documents in the collection
return TimeAndSpace.find();
}
});
}
但是我的Collection有一些重复数据和一些空记录。我如何过滤掉这些?我也想按两个字段排序。我的 Collection 是这样构造和写入的:
TimeAndSpace = new Mongo.Collection('timeAndSpace');
if (Meteor.isClient) {
Template.addTimeSpaceForm.events({
'submit form': function(event){
event.preventDefault();
var city = event.target.city.value;
var state = event.target.state.value;
var yearin = event.target.yearin.value;
var yearout = event.target.yearout.value;
Meteor.call('insertLocationData', city, state, yearin, yearout);
}
});
}
if (Meteor.isServer) {
Meteor.startup(function () {
// code to run on server at startup
});
Meteor.methods({
'insertLocationData': function(city, state, yearin, yearout){
TimeAndSpace.insert({
ts_city: city,
ts_state: state,
ts_yearin: yearin,
ts_yearout: yearout
});
}
});
}
我希望文档先按yearin,然后按yearout排序(这样如果有多个文档具有相同的yearin值(例如1984),它们将按此顺序返回:
Helena Montana 1984 1984
San Andreas California 1984 1987
(反之亦然)
那么如何过滤掉空的和多余的文档,并按照指定的字段对文档进行排序呢?
更新
认为答案未返回任何数据的问题可能是 "city" 字段应为 "ts_city" 而 "state" 字段应为 "ts_state",我试过这个:
return TimeAndSpace.find(
{ts_city: {$exists: true, ne: ""}, ts_state: {$exists: true, ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
...但它仍然 returns 没有数据。
更新 2
当我在控制台中输入时:
TimeAndSpace.find(
{ts_city: {$exists: true, ne: ""}, ts_state: {$exists: true, ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
我得到:
Exception in template helper: Error: Inconsistent operator: {"$exists":true,"ne":""}
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1269:15
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at isOperatorObject (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1263:5)
at compileValueSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1459:14)
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1439:9
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at compileDocumentSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1422:5)
at _.extend._compileSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1399:12)
at new Minimongo.Matcher (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1342:27)
at new LocalCollection.Cursor (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:144:20)
XHR finished loading: GET "http://localhost:3000/sockjs/info?cb=8zcc5akr4u".
return TimeAndSpace.find(
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
Uncaught SyntaxError: Illegal return statement
at Object.InjectedScript._evaluateOn (<anonymous>:905:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:838:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
TimeAndSpace.find(
{ts_city: {$exists: true, ne: ""}, ts_state: {$exists: true, ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
Uncaught Error: Inconsistent operator: {"$exists":true,"ne":""}
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1269:15
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at isOperatorObject (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1263:5)
at compileValueSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1459:14)
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1439:9
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at compileDocumentSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1422:5)
at _.extend._compileSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1399:12)
at new Minimongo.Matcher (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1342:27)
at new LocalCollection.Cursor (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:144:20)
先来个简单的,去掉空格排序:
return TimeAndSpace.find(
{ts_city: {$exists: true, $ne: ""}, ts_state: {$exists: true, $ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
另一方面,重复数据删除可能最好由 cron 作业处理,该作业会查找您所关心的重复数据类型并删除有问题的文档。这在查询期间是不可能的,它会在呈现期间成为 PIA。
获取 MongoDB collection 中的所有数据非常简单。您只需使用 Collection 实例名称并调用 find:
TimeAndSpace = new Mongo.Collection('timeAndSpace');
if (Meteor.isClient) {
. . .
Template.placesLived.helpers({
places: function () {
// this helper returns a cursor of all of the documents in the collection
return TimeAndSpace.find();
}
});
}
但是我的Collection有一些重复数据和一些空记录。我如何过滤掉这些?我也想按两个字段排序。我的 Collection 是这样构造和写入的:
TimeAndSpace = new Mongo.Collection('timeAndSpace');
if (Meteor.isClient) {
Template.addTimeSpaceForm.events({
'submit form': function(event){
event.preventDefault();
var city = event.target.city.value;
var state = event.target.state.value;
var yearin = event.target.yearin.value;
var yearout = event.target.yearout.value;
Meteor.call('insertLocationData', city, state, yearin, yearout);
}
});
}
if (Meteor.isServer) {
Meteor.startup(function () {
// code to run on server at startup
});
Meteor.methods({
'insertLocationData': function(city, state, yearin, yearout){
TimeAndSpace.insert({
ts_city: city,
ts_state: state,
ts_yearin: yearin,
ts_yearout: yearout
});
}
});
}
我希望文档先按yearin,然后按yearout排序(这样如果有多个文档具有相同的yearin值(例如1984),它们将按此顺序返回:
Helena Montana 1984 1984
San Andreas California 1984 1987
(反之亦然)
那么如何过滤掉空的和多余的文档,并按照指定的字段对文档进行排序呢?
更新
认为答案未返回任何数据的问题可能是 "city" 字段应为 "ts_city" 而 "state" 字段应为 "ts_state",我试过这个:
return TimeAndSpace.find(
{ts_city: {$exists: true, ne: ""}, ts_state: {$exists: true, ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
...但它仍然 returns 没有数据。
更新 2
当我在控制台中输入时:
TimeAndSpace.find(
{ts_city: {$exists: true, ne: ""}, ts_state: {$exists: true, ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
我得到:
Exception in template helper: Error: Inconsistent operator: {"$exists":true,"ne":""}
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1269:15
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at isOperatorObject (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1263:5)
at compileValueSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1459:14)
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1439:9
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at compileDocumentSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1422:5)
at _.extend._compileSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1399:12)
at new Minimongo.Matcher (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1342:27)
at new LocalCollection.Cursor (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:144:20)
XHR finished loading: GET "http://localhost:3000/sockjs/info?cb=8zcc5akr4u".
return TimeAndSpace.find(
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
Uncaught SyntaxError: Illegal return statement
at Object.InjectedScript._evaluateOn (<anonymous>:905:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:838:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
TimeAndSpace.find(
{ts_city: {$exists: true, ne: ""}, ts_state: {$exists: true, ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
Uncaught Error: Inconsistent operator: {"$exists":true,"ne":""}
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1269:15
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at isOperatorObject (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1263:5)
at compileValueSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1459:14)
at http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1439:9
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at compileDocumentSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1422:5)
at _.extend._compileSelector (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1399:12)
at new Minimongo.Matcher (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:1342:27)
at new LocalCollection.Cursor (http://localhost:3000/packages/minimongo.js?af9eb9d7447544ca9b839a3dcf7ed2da2209b56c:144:20)
先来个简单的,去掉空格排序:
return TimeAndSpace.find(
{ts_city: {$exists: true, $ne: ""}, ts_state: {$exists: true, $ne: ""}},
{sort: {ts_yearin: 1, ts_yearout: 1}}
);
另一方面,重复数据删除可能最好由 cron 作业处理,该作业会查找您所关心的重复数据类型并删除有问题的文档。这在查询期间是不可能的,它会在呈现期间成为 PIA。