【问题标题】:mongodb/meteor collection query with javascript object带有 javascript 对象的 mongodb/meteor 集合查询
【发布时间】:2015-07-27 18:35:34
【问题描述】:

相关:mongodb/meteor collection check if subdocument field exists when field is a variable

我正在尝试通过构建具有一些变量字段名称的对象来查询 Meteor 集合。这在对象有一个字段时有效,例如

var query = {};
query['myField.'+myVariable] = {$exists: true};
Collection.find(query); //works fine

但我需要使用多个选择器进行查询。例如,我需要检查是否存在带有变量的字段名称,还需要检查其他字段是否 = true,以及其他字段是否 = 变量。所以我试图找到一种构建查询对象的通用方法。我尝试了以下方法:

var query = {};
query['myField.'+myVariable] = {$exists: true};
query[newField] = false;
Collection.find(query);

这不起作用。我不确定这是否是因为“newField”不是 Object 类型的。

我也尝试过使用 $and 选择器来查看它是否有效,但我认为我使用的语法并不完全正确...

var query = {};
var object = {};
object['myField'.+myVariable] = {$exists: true};
query['$and'] = [object, {newField: false}];
Collection.find(query);

这也行不通。我试图用 mongo $and 选择器来构建,它通过使用数组来工作。

如何在语法上使用 javascript 对象表示法和对象文字构建 Meteor 集合查询?我觉得其中任何一个都应该有效。

具体来说,我正在寻找以下内容(半伪代码,因为使用点表示法获取子文档/子对象不适用于 mongo 查询)

Collection.find({correlated: false, readBy.(Meteor.userId()): {$exists: true} ...)

我也认为这应该可行:

var query = {};
query['myField.'+myVariable] = {$exists: true};
Collection.find(query, {otherField: false}) 
//OR 
var query2 = {};
query['priority'] = false;
Collection.find(query, query2)

但他们都没有。

编辑:示例文档。我想找到当前用户 ID 不是 readBy 字段并且相关的文档:false

{
    "_id" : ObjectId("55b6868906ce5d7b1ac6af10"),
    "title" : "test",
    "correlated" : "false",
    "readBy" : {
        "DXqLhesDEJq4ye8Dy" : ISODate("2015-07-27T18:29:43.592Z")
    }
}

【问题讨论】:

  • 伪代码是整个问题中最重要的一行。你能确保它包含你想要从查询中得到的一切吗? IE。不要遗漏任何东西。
  • 重要的是要知道 mongo 查询只是 JavaScript 对象,所以符号无关紧要。你的第二个代码块中的查询对象对我来说看起来是正确的,我只是假设你的查询没有找到任何东西,而不是没有工作。
  • 你说的不起作用是什么意思?你的文档结构是什么?
  • 我将检查它是否只是查询没有返回任何文档,但它们的结构如下:每个文档都有一个名为 readBy 的字段,它是一个对象。该对象的字段是 userIds,这些字段的值是时间戳。然后,我有另一个与 correlated 分开的字段,它是 true 或 false。我想在readBy 子文档中找到每个具有userId 字段并且具有correlated = false 的文档。

标签: javascript mongodb meteor


【解决方案1】:

find 只有一个选择器参数。所以这个:

Collection.find(query, {otherField: false})

不正确。 query 必须包含有关 otherField 的信息。仔细看看这个示例代码:

// 'readBy.abc123'
var key = 'readBy.' + Meteor.userId();

// build the selector by parts
var selector = {correlated: false};
selector[key] = {$exists: false};

// selector should now be something like:
// {correlated: false, 'readBy.abc123': {$exists: false}}
// note that these are ANDed together so all conditions must be true

// here's a cursor you can use to fetch your documents
var cursor = Collection.find(selector);

// log one of the selected documents
console.log(Collection.findOne(selector));

【讨论】:

  • 我明白为什么后两者是错误的并且语法是有道理的,谢谢。他们没有得到可能有一个数据库原因,但是查询非常简单,我不确定为什么我没有得到结果。
  • 我认为我可能必须将 correlated 和 false 包装在一个字符串中,例如 `var selector = {'correlated':'false'} 因为当我尝试使用 findOne from除非我这样做,否则我什么也得不到。
  • 在您的问题中,我建议您展示一个您尝试选择的示例文档。
  • 好的,我更新了答案以匹配实际问题。希望这对你有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多