【问题标题】:Complex query with two $OrderBy带有两个 $OrderBy 的复杂查询
【发布时间】:2014-01-27 21:13:16
【问题描述】:

这是我收藏的结构部分:

by: [
   {
      id: ObjectId("XX"),
      type: NumberInt(1)
   } 
],
timestamp: NumberInt(), // is timestamp 1
status: NumberInt(0),
mails: [
   {
      id: ObjectId("YY"),
      text: "",
      timestamp: NumberInt(), // is timestamp 2
   }
]

我可以通过以下几行根据时间戳1按时间顺序恢复我的数据:

...
bson_init(&query);
bson_append_document_begin(&query, "$orderby", -1, &child);
bson_append_int32(&child, "timestamp", -1, 1);
bson_append_document_end(&query, &child);
bson_append_document_begin(&query, "$query", -1, &child);
bson_append_document_end(&query, &child);
collection = mongoc_client_get_collection(client, "db", "prefix");
cursor = mongoc_collection_find(collection, MONGOC_QUERY_NONE, 0, 0, 0, &query, NULL, NULL);
while(mongoc_cursor_next(cursor, &doc)){
   bson_iter_t iter;
   if(bson_iter_init_find(&iter, doc, "status")){
      status = bson_iter_int32(&iter);
   }
   ...
}
...

但现在我想按时间顺序(或不按时间顺序)检索“mails”数组中的所有值......你知道这个过程吗?

【问题讨论】:

  • 顺便说一句,看起来您正在通过代码中的filename 键进行排序。而且您的示例文档中没有此密钥。
  • 对不起是我的错。这是时间戳键,不是文件名
  • 没关系。顺便说一句,看看我的回答,也许它会对你有所帮助。

标签: mongodb bson mongodb-c


【解决方案1】:

看来您必须使用 Aggregation Framework 才能使其正常工作。

想法(在 javascript 中):

db.test.aggregate([
    { $unwind: "$mails" }, 
    { $sort: { timestamp: 1, "mails.timestamp": 1 } }, 
    { $group: { _id: "$_id", mails: { $push: "$mails" } } }
]);

目前我不确定如何将其翻译成 C。尝试查看mongoc_collection_aggregate docs。

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多