当前位置: 首页 > 知识库问答 >
问题:

nodejs mongodb访问节点。查询中具有文档id字段值的js对象

阎佑运
2023-03-14

我正在学习MongoDB与NodeJS一起使用。以下是我的代码:

let configMap = {
    '1': 10,
    '2': 12,
    '3': 13
}
let myData = await mongo_groups_collection.find({
    _id: {
        $in: [1,2,3]
    },
    active: true
}).project({
    '_id': 1,
    'name': 1,
    'members': 1,
    'messages': {
        $slice: [-(configMap[_id]), (DEFAULT_PAGE_SIZE_FILL * PAGE_SIZE) + (PAGE_SIZE - ((configMap[_id]) % PAGE_SIZE))] //Need to use _id to get configMap value

    }
}).toArray();

我在Mongo slice函数中使用“configMap”nodeJS变量从数组中检索一定数量的元素。要检索,我需要使用未获取的“\u id”字段值进行查找,并遇到\u id“undefined”错误。

共有1个答案

太叔灿
2023-03-14

这是因为(configMap[\u id])是在节点中编译的。js代码,但不是作为查询在数据库上。因此,在代码中,当这个查询被编译时,它无法找到\u id,因为您没有像对configMap变量那样声明它。

您希望id值是文档中的实际id。所以,如果您使用(configMap[$\u id]),它就不能以这种方式工作,因为您不能将javascript对象与文档字段合并。

您仍然可以使用如下所示的聚合查询来执行此操作-我们实际上将所需的v值作为字段添加到文档中以供进一步使用:

 /** Make `configMap` an array of objects */
var configMap = [
  { k: 1, v: 10 },
  { k: 2, v: 12 },
  { k: 3, v: 13 },
];

let myData = await mongo_groups_collection.aggregate([
  {
    $match: { _id: { $in: [1, 2, 3] }, active: true }
  },
  /** For each matched doc we'll iterate on input `configMap` array &
   *  find respective `v` value from matched object where `k == _id`  */
  {
    $addFields: {
      valueToBeSliced: {
        $let: {
          vars: { matchedK: { $arrayElemAt: [ { $filter: { input: configMap, cond: { $eq: ["$$this.k", "$_id"] } } }, 0 ] } },
          in: "$$matchedK.v",
        }
      }
    }
  },
  {
    $project: {
      messages: { $slice: ["$messages", { $subtract: [0, "$valueToBeSliced"] }, someInputValue ] },
      name: 1, members: 1
    }
  }
]).toArray();

参考:$出租

注:

  1. 在投影中,您不需要提及这个'_id': 1,因为它默认包含在内。
  2. 由于您的查询使用的是. search(),因此您可能使用了无法在聚合中使用的$seply-projing-运算符,而我们需要使用$seply-聚合运算符,两者做同样的事情但有语法变化,您需要参考文档。
  3. 此外,在一些InputValue中,您需要传入(DEFAULT_PAGE_SIZE_FILL*PAGE_SIZE)(PAGE_SIZE-((配置地图[_id])%PAGE_SIZE))-因此尝试使用聚合运算符$划分来获取值。我们正在执行{$减去:[0,"$value eToBeSliced"]}将正value eToBeSliced转换为负,因为我们不能像通常在javaScript中那样做-value eToBeSliced
 类似资料:
  • 问题内容: 我有一个具有唯一的数字运行ID的文档集合,我想找到运行ID最高的文档。 我可以做两个查询。 首先,我可以找到最高的运行ID: 其次,我可以找到具有该运行ID的文档: 有没有办法我可以通过一个查询做到这一点? 问题答案: 您可以通过组合“ sort”和“ size”来实现: 这将返回最高的记录

  • 我必须将此添加到我执行的每个搜索查询中。我有一个大约20,000个文档的索引,我真的不想重建它,因为我在上一个版本中让我的用户重建了他们的索引。注意:这是在android设备上,所以需要很长的时间和大量的电池来重新索引他们的所有文档。 谢谢你的帮助。

  • 我正在尝试查找不包含至少一个具有特定字段值的文档的所有文档。例如,下面是一个示例集合: 我希望找到docs块中没有包含至少一个foo=1的记录的文档的每个记录。在上面的示例中,应该只返回第二个文档。 我还查看了$nin运算符,但示例只显示数组包含基元值列表时的情况,而不是附加文档。当我尝试使用类似于下面的东西来实现这一点时,它查找的是确切的文档,而不仅仅是我想要的foo字段。 有没有用基本运算符来

  • 每个食谱文档包含三个内容。一个名为的字段,其中存储菜谱的名称;一个名为的字段,其中存储创建者uid的,以及一个名为的子集合,其中包含带有一些随机字段的文档。 问题是,使用这些规则只能创建菜谱文档。子集合及其文档不会创建,因为db表示 FirebaseError:[code=permission-denied]:缺少权限或权限不足。FirebaseError:缺少权限或权限不足。

  • 如何在下面的示例中从Cloud FiRecovery查询某个日期()和某些用户()的所有时间戳?现在,我可以下载整个文档并在设备上对其进行过滤。但它无效。

  • 在这里给ElasticSearch的初学者排名。 我有一个客户列表,他们的订单作为一个嵌套字段。假设文档结构如下: 我想查询的是:在两个日期之间订购了一定数量的用户列表。我希望能够将它与例如生日的范围查询结合起来。 我已经到了这样的地步,我可以使用聚合来获得每个订户在两个日期之间的排序总和: 但是,我想限制查询部分返回的结果,以便更好地与所有其他过滤器混合。 我的第一个想法是使用一个脚本过滤器,并