我正在尝试在 MongDB 中编写查询以选择用户已部分完成其配置文件的所有行。
其中f1或f2或f3为null或''但不在三个字段为null或''的地方
我的意思是三个字段中的一个或两个为空但不是三个字段
我试过这个没有返回预期的记录: 已更新
var query = {
$or:[
{"profile.public.f1": {$in: [null, false, '']}},
{"profile.public.f2": {$in: [null, false, '']}},
{"profile.public.f3": {$in: [null, false, '']}}
]
};
此查询在 nodejs 中使用如下:
function GetDocument(model, query, projection, extension, callback) {
var query = db[model].find(query, projection, extension.options);
if (extension.populate) {
query.populate(extension.populate);
}
if (extension.sort) {
query.sort(extension.sort);
}
query.exec(function (err, docs) {
if (extension.count) {
query.count(function (err, docs) {
callback(err, docs);
});
} else {
callback(err, docs);
}
});
}
然后:
db.GetDocument('users', query, {}, {}, function (err, docdata) {
console.log(docdata)
});
最佳答案
使用 $where:
> db.createCollection("t");
{ "ok" : 1 }
> db.t.insert({f1:'a',f2:'',f3:''});
WriteResult({ "nInserted" : 1 })
> db.t.insert({f1:'',f2:'',f3:null});
WriteResult({ "nInserted" : 1 })
> db.t.insert({f1:'',f2:'',f3:''});
WriteResult({ "nInserted" : 1 })
> db.t.insert({f1:'',f2:''});
WriteResult({ "nInserted" : 1 })
> db.t.find();
{ "_id" : ObjectId("58aab60118633becf0ac4f80"), "f1" : "a", "f2" : "", "f3" : "" }
{ "_id" : ObjectId("58aab60718633becf0ac4f81"), "f1" : "", "f2" : "", "f3" : null }
{ "_id" : ObjectId("58aab61018633becf0ac4f82"), "f1" : "", "f2" : "", "f3" : "" }
{ "_id" : ObjectId("58aab65618633becf0ac4f83"), "f1" : "", "f2" : "" }
> var q = {$where: function() {return ((this.f1.length||'') + (this.f2.length||'') +(this.f3 || '').length) >0;}};
> db.t.find(q);
{ "_id" : ObjectId("58aab60118633becf0ac4f80"), "f1" : "a", "f2" : "", "f3" : "" }
查询分割:
{
$where: function(){
return((this.f1.length||'')+(this.f2.length||'')+(this.f3||'').length)>0;
}
};
哪里应该返回 true => 字符串(字段值)的总和必须大于零。这样uf fieldN = '',那么它的长度就等于0,如果三个都等于0,它们的和就会是0(0+0+0)=0,但是如果至少有一个值<>'',然后它会返回 true,这样就满足了 where 子句。
现在的问题是 null.length 不会工作,所以我们要么将它包装在 String(null) 中,要么在它失败时给出任何合适的值,所以我们在语义上是错误的,但更短且有效 this .f1.length||'' 如果第一次失败,第二次成功。运算符 OR 获取第一个工作值...
如果你想在 nodejs 中使用它,而不是 mongo shell,这里是示例:
vao@vao-VirtualBox:~$ nodejs
> var MongoClient = require('mongodb').MongoClient,
... co = require('co'),
... assert = require('assert');
undefined
>
> co(function*() {
... var db = yield MongoClient.connect('mongodb://localhost:27017/test');
... var col = db.collection('t');
... var q = {$where: function() {return ((this.f1.length||'') + (this.f2.length||'') +(this.f3 || '').length) >0;}};
... //var cursor = col.find({f1.length:{$gt:0}});
... var cursor = col.find({f1:"a"});
... col.find().toArray(function(err, items) {});
... var stream = col.find(q).stream();
... stream.on("data", function(item) {});
... stream.on("end", function() {});
...
... while(yield cursor.hasNext()) {
... var doc = yield cursor.next();
... console.dir(doc);
... }
...
... db.close();
... }).catch(function(err) {
... console.log(err.stack);
... });
Promise { <pending> }
>
> { _id:
ObjectID {
_bsontype: 'ObjectID',
id:
Buffer {
'0': 88,
'1': 172,
'2': 1,
'3': 143,
'4': 157,
'5': 175,
'6': 27,
'7': 230,
'8': 160,
'9': 208,
'10': 69,
'11': 88 } },
f1: 'a',
f2: '',
f3: '' }
(To exit, press ^C again or type .exit)
>
关于MongoDB 查询哪里不是全部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42340558/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e
假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有
我在Rails上使用带有ruby的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s
我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params
我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf
我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使