草庐IT

MongoDB 查询哪里不是全部

coder 2023-11-07 原文

我正在尝试在 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/

有关MongoDB 查询哪里不是全部的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用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.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用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

  3. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果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

  6. ruby-on-rails - ActiveRecord::Associations::CollectionProxy 从哪里获取.each 实例方法? - 2

    假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有

  7. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  8. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个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

  9. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐